![awk 使用另一个文件的行号过滤文件的内容](https://linux22.com/image/180120/awk%20%E4%BD%BF%E7%94%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E8%A1%8C%E5%8F%B7%E8%BF%87%E6%BB%A4%E6%96%87%E4%BB%B6%E7%9A%84%E5%86%85%E5%AE%B9.png)
我正在尝试awk
根据另一个文件的内容过滤文件中的某些内容。但它不起作用。
我有两个文件,orig_data 和 noghest_data。两个文件具有相同的行数,并且行对应于相同的事件但内容不同。我想打印 noghest_data 的内容,该内容对应于 orig_data 不以Ghest
.我的下面的代码不起作用。它打印所有内容。
awk -F " " 'NR==FNR{if($0 ~ /^Ghest/) {line[NR]++} next} !(NR in line) {print $0}' orig_data.txt noghest_data.txt
答案1
你的剧本几乎没问题。稍微简化一下:
awk 'NR == FNR && /^Ghest/ {line[NR]} NR > FNR && ! (FNR in line)' \
orig_data.txt noghest_data.txt
第一个模式 ( NR == FNR && /^Ghest/
) 仅对于第一个输入文件中也以该字符串开头的行计算结果为 true Ghest
。相应的操作将当前行号添加为数组的索引line
。
NR > FNR && ! (FNR in line)
对于第一个模式以外的输入文件,第二个模式 ( ) 的计算结果为 true,如果相对于当前文件的行号不是数组的索引line
(print $0
省略该操作时是默认操作)。
作为埃德·莫顿 建议NR
,这也可以通过仅比较一次来提高效率FNR
:
awk 'NR == FNR { if (/^Ghest/) line[NR]; next } !(FNR in line)'