この部分を読むのに問題があります。私のファイルには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
to を割り当てるのは文字列の割り当てであり、(if 条件で) 文字列を実行するコマンドとisFirstLine
言いました。$isFirstLine
とはbashに組み込まれているため、速度に大きな影響を与えずに直接使用できますが、読みやすさが大幅に向上しますtrue
。false
最後の行は$1
入力ファイル名と呼ばれるので、呼び出しは次のようになります。
./test.sh inputfile.txt