我对这行阅读有疑问。我的文件中有 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"
事实上,赋值true
给isFirstLine
就是一个字符串赋值,只是提到$isFirstLine
(在if条件中)就是执行这个字符串的命令。由于true
和false
是 bash 内置函数,因此可以直接使用它们,不会对速度产生重大影响,但可读性大大提高。
最后一行提到$1
作为输入文件名,因此调用:
./test.sh inputfile.txt