![仅当一行上的值紧接着另一个值时才打印到文件 bash](https://linux22.com/image/134033/%E4%BB%85%E5%BD%93%E4%B8%80%E8%A1%8C%E4%B8%8A%E7%9A%84%E5%80%BC%E7%B4%A7%E6%8E%A5%E7%9D%80%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%80%BC%E6%97%B6%E6%89%8D%E6%89%93%E5%8D%B0%E5%88%B0%E6%96%87%E4%BB%B6%20bash.png)
我有一个文件(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