2013-09-22 128 views
1

我是awk脚本的新手。 我想通过两个文件File1.txt和File2.txt的字(字段)比较做一个字段。 这些文件包含|的列表(管)分开的领域。awk脚本:检查一个文件中的所有单词(字段)是否包含在另一个文件中

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)的第三行在两个文件中都不匹配。

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

这两个文件都会按照顺序排列。

回答

1

两个比较两个文件,更好地利用已经内置命令那么sdiff:

sdiff File1 File2 

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

用awk做。

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

谢谢,但这会比较两行中的内容代替每一行中的一个字段。 – user2804482

+1

awk单线程将比较file2中的第2行到file1中的第1行。不是OP想要的。“我们比较相同的行号。在这两个文件中.' – Kent

+0

谢谢我想要一个类似的东西,但我也想在每一行中按字段进行比较。所以如果一个领域不匹配我可以说哪个领域不匹配。 – user2804482

2

这行应该做的:

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

输出:

rrr|sss|ttt|uuu|vvv 
rrr|sss|ttt|uuu|uuu 
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 
相关问题