awk 使用另一个文件的行号过滤文件的内容

She*_*hew 0 linux awk text-processing

我正在尝试awk根据另一个文件的内容来过滤文件中的某些内容。但它不起作用。

我有两个文件,orig_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
Run Code Online (Sandbox Code Playgroud)

fra*_*san 5

你的脚本几乎没问题。稍微简化:

awk 'NR == FNR && /^Ghest/ {line[NR]} NR > FNR && ! (FNR in line)' \
  orig_data.txt noghest_data.txt
Run Code Online (Sandbox Code Playgroud)

第一个模式 ( NR == FNR && /^Ghest/) 仅对第一个输入文件中同样以字符串开头的行计算为真Ghest。相应的操作将当前行号添加为line数组的索引。

如果相对于当前文件的行号不是数组的索引(这是省略操作时的默认操作)NR > FNR && ! (FNR in line),则第二个模式 ( ) 对于第一个以外的输入文件评估为真。lineprint $0

正如Ed Morton 所 建议的,这也可以通过只比较一次NR来提高效率FNR:

awk 'NR == FNR { if (/^Ghest/) line[NR]; next } !(FNR in line)'
Run Code Online (Sandbox Code Playgroud)

  • 使用`awk 'NR == FNR { if (/^Ghest/) line[NR]; next } !(FNR in line)'` 这样您就不会将 NR 与 FNR 进行两次比较。 (2认同)