读取 BASH 行(输出 $line 和下面的行)

读取 BASH 行(输出 $line 和下面的行)

我对这行阅读有疑问。我的文件中有 n 行。如何在同一循环步骤中存储下面一行中的值?也许有人可以帮我吗?

谢谢

细节:

$ cat testfile.txt
1
2
3
4
5
6
7
8
9
10
while read line; do echo "Current line read: $line"; echo "Line below: `grep -A 1 $line testfile.txt`"; done < testfile.txt
Current line read: 1
Line below: 1
2
--
10
Current line read: 2
Line below: 2
3
Current line read: 3
Line below: 3
4
Current line read: 4
Line below: 4
5
Current line read: 5
Line below: 5
6
Current line read: 6
Line below: 6
7
Current line read: 7
Line below: 7
8
Current line read: 8
Line below: 8
9
Current line read: 9
Line below: 9
10
Current line read: 10
Line below: 10
#

grep -A 1 6 testfile.txt 6 7

grep -A 1 6 testfile.txt | grep -v 6 7

答案1

您的解决方案的问题是您grep为每一行调用。事实上,grep 也会解析每一行。因此,对于包含 n 行的文件,这些行将被解析 n^2 次,并且加载grep是一个相当昂贵的调用。

使用单行缓冲区,在本例中称为PrevLine,如下所示:

#!/bin/bash
CurLine=''
isFirstLine=true
while IFS='' read -r LineBelow; do
  if $isFirstLine; then
    echo "This is the first line, so no previous."
  else
    echo "Current line read: ${CurLine}"
    echo "Line below: ${LineBelow}"
  fi
  CurLine="${LineBelow}"
  isFirstLine=false
done <"$1"

事实上,赋值trueisFirstLine就是一个字符串赋值,只是提到$isFirstLine(在if条件中)就是执行这个字符串的命令。由于truefalse是 bash 内置函数,因此可以直接使用它们,不会对速度产生重大影响,但可读性大大提高。

最后一行提到$1作为输入文件名,因此调用:

./test.sh inputfile.txt

相关内容