awk脚本:检查一个文件中的所有单词(字段)是否包含在另一个文件中

时间:2013-09-22 15:49:29

标签: bash unix awk compare

我是awk脚本新手。 我想通过两个文件File1.txt和File2.txt的单词(字段)比较来做一个字段。 这些文件包含一个列表(管道)分隔的领域。

    File 1:
    -------------------
    aaa|bbb|ccc|eee|fff
    lll|mmm|nnn|ooo|ppp
    rrr|sss|ttt|uuu|vvv

    File 2: 
    -------------------
    aaa|bbb|ccc|eee|fff
    rrr|sss|ttt|uuu|vvv
    rrr|sss|ttt|uuu|uuu

我们比较相同的行号。在两个文件中。

两个文件的第1行中的字段匹配。

在第2行中,所有字段(lll,mmm,nnn,ooo,ppp)都不匹配文件2的第2行中的所有字段(rrr,sss,ttt,uuu,vvv)。类似于第5个字段(vvv) ,uuu)两个文件中的第3行不匹配。

因此行号。 2号线和号码3应该得到bash的回应。

这两个文件都将遵循订单。

3 个答案:

答案 0 :(得分:2)

这一行应该:

awk 'NR==FNR{a[FNR]=$0;next}a[FNR]!=$0' file1 file2

输出:

rrr|sss|ttt|uuu|vvv
rrr|sss|ttt|uuu|uuu

答案 1 :(得分:1)

两个比较两个文件,更好地使用内置命令sdiff:

 sdiff File1 File2

这将显示两个文件中不同的行。

使用awk。

awk -F '|' 'NR==FNR{a[$0];next}!($0 in a){print $0}' file1 file2

答案 2 :(得分:0)

以下几行可能会根据需要进行调整,另一种语言如perl可能更合适

i=1
while read -r -u4 l1 || read -r -u5 l2; do
  if [[ $l1 != $l2 ]]; then
    echo "$i: $l1 != $l2"
  fi
  ((i+=1))
done 4<file1 5<file2