比较两个文件并使用awk从两者中提取信息

时间:2017-03-02 14:49:28

标签: bash awk

cat file1:

a
b
c
d
e

cat file2:

a  10
c  20
e  30
f  40

所需的输出文件是:

a  10
b
c  20
d
e  30
f  40

我尝试过使用awk,但最后我重复了所有的file1行。 非常感谢

3 个答案:

答案 0 :(得分:3)

读入这两个文件并将它们哈希到一个数组(a)。如果您在file1之前阅读file2,那么碰撞将对您有利。在awk:

$ awk '{a[$1]=$0} END{for(i in a) print a[i]}' file1 file2
a  10
b
c  20
d
e  30
f  40

说明:

{
    a[$1]=$0        # hash all records to a 
} 
END {               # after processing both files
    for(i in a)     # iterate thru every key in a
        print a[i]  # and output their values
}

由于for(i in a)的性质,输出顺序是随机的。

答案 1 :(得分:2)

另一种awk而且不太聪明的方法

$ awk 'NR==FNR {a[$1]=$2; next} 
       $1 in a {$2=a[$1]; delete a[$1]} 
               1; 
       END     {for(k in a) print k,a[k]}' file2 file1

a 10
b
c 20
d
e 30
f 40

答案 2 :(得分:0)

不确定awk是否是OP的硬性要求,但这里是使用join的替代解决方案,这似乎更适合手头的工作(正如@shellter所指出的那样) :

$ join -a1 -a2 file1 file2