【问题标题】:comparing two files and extracting info from both using awk比较两个文件并使用 awk 从两者中提取信息
【发布时间】:2017-03-02 14:49:27
【问题描述】:

猫文件1:

a
b
c
d
e

猫文件2:

a  10
c  20
e  30
f  40

所需的输出文件是:

a  10
b
c  20
d
e  30
f  40

我尝试过使用 awk,但我以重复 file1 的所有行结束。 非常感谢

【问题讨论】:

  • 控制该输出的逻辑是什么?
  • "我尝试过使用 awk" .. 您需要在 Q 中包含代码,以便我们帮助修复它!或者尝试搜索[linux] join 或[bash] join 并阅读man join。祝你好运。

标签: bash awk


【解决方案1】:

读取这两个文件并将它们散列到一个数组 (a)。如果您在file2 之前阅读file1,冲突将对您有利。在 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) 的性质,输出顺序是随机的。

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

      $ join -a1 -a2 file1 file2
      

      【讨论】:

        猜你喜欢
        • 2017-01-31
        • 2016-08-23
        • 2015-02-22
        • 2018-03-04
        • 1970-01-01
        • 2017-07-25
        • 2012-09-05
        • 2017-10-25
        相关资源
        最近更新 更多