仅当一行上的值紧接着另一个值时才打印到文件 bash

仅当一行上的值紧接着另一个值时才打印到文件 bash

我有一个文件(xyz.dat),其中包含各种随机语句。我需要做的是在该文件中搜索VALUE1一行,并且仅在VALUE1紧随其后的新行中打印到文件VALUE2

输入示例:

1 VALUE1
2 VALUE1
3 VALUE1
4 VALUE2
5 VALUE1
6 VALUE2
7 VALUE2

预期输出:

3 VALUE1
4 VALUE2
5 VALUE1
6 VALUE2

答案1

简单的sed方法:

sed -n '/ VALUE1$/{ N; / VALUE2$/p }' xyz.dat > new.txt

new.txt内容:

3 VALUE1
4 VALUE2
5 VALUE1
6 VALUE2

答案2

与 sed

sed '/ VALUE1$/!d;N;/ VALUE2$/b;D' infile

答案3

另一种awk方法:

awk '/VALUE1/{ bkup=$0 } /VALUE2/ && bkup{print bkup ORS $0; bkup=""}' infile

答案4

Awk解决方案:

-- 基于getline功能:

awk '/ VALUE1$/ && (getline nl) > 0 && nl ~ /VALUE2$/{ print $0 ORS nl }' xyz.dat

-- 基于记录数比较:

awk '/ VALUE1$/{ rec = $0; rn = NR+1 }NR == rn && /VALUE2$/{ print rec ORS $0 }' xyz.dat

输出(两者):

3 VALUE1
4 VALUE2
5 VALUE1
6 VALUE2

相关内容