使用 awk 比较两个连续行与匹配模式并删除匹配的第一行

使用 awk 比较两个连续行与匹配模式并删除匹配的第一行

我有一个这样的文件:

apple 1
apple 2
mango 3
apple 2
mango 4
mango 5
apple 3
apple 4
cherry 6
cherry 7
cherry 8
apple 5
cherry 9

我想在一行中使用 awk 或 sed 来删除与apple保留第二行的模式匹配的连续行的行。我还想保留与模式不匹配的其余行并获得如下输出:

apple 2
mango 3
apple 2
mango 4
mango 5
apple 4
cherry 6
cherry 7
cherry 8
apple 5
cherry 9

答案1

对你的 awk 脚本进行更多优化:

awk '$1=="apple"{l=$0;next}l{print l; l=""}1' file 

这依赖于将与模式l匹配的行存储到变量中apple。仅当未找到花样时才打印存储的行。

答案2

经过一番尝试和错误后我得到了答案:

awk '{a=$1;b=$2;row1=NR;getline;row2=NR;c=$1;d=$2;if(row1==row2 || (a=="apple" && c=="apple")) {print c " " d;} else {print a " " b;print c " " d;}}' FILE

这给出了输出:

apple 2
mango 3
apple 2
mango 4
mango 5
apple 4
cherry 6
cherry 7
cherry 8
apple 5
cherry 9

相关内容