【问题标题】:AWK command for sum 2 filessum 2 个文件的 AWK 命令
【发布时间】:2016-02-15 09:57:33
【问题描述】:

我是 awk 的新手,如果发现同一列,我需要 awk 命令来汇总 2 个文件

文件 1

a | 16:00 | 24
b | 16:00 | 12
c | 16:00 | 32

文件 2

b | 16:00 | 10
c | 16:00 | 5
d | 16:00 | 14

输出应该是

a | 16:00 | 24
b | 16:00 | 22
c | 16:00 | 37
d | 16:00 | 14

我在这里阅读了一些问题,但仍然找到了正确的方法,我已经尝试过使用这个命令

awk 'BEGIN { FS = "," } ; FNR=NR{a[$1]=$2 FS $3;next}{print $0,a[$1]}'

请帮帮我,谢谢

【问题讨论】:

    标签: unix awk


    【解决方案1】:

    此脚本也使用sort,但它会起作用,

    awk -F'|'  ' { f[$1] += $3 ; g[$1] = $2 } END { for (a in f) { print a , "|",  g[a] , "|",  f[a] } } '   a.txt b.txt | sort
    

    结果是

        a  |  16:00  | 24
        b  |  16:00  | 22
        c  |  16:00  | 37
        d  |  16:00  | 14
    

    【讨论】:

    • 不错!请注意,您也可以说BEGIN{FS=OFS="|"},这样您就可以使用print a, g[a], f[a],而不是在那里对管道进行硬编码。
    • @fedorqui,你是对的。其实我觉得第一个sort也可以换成cat。谢谢。
    • 是的,或者只是一起处理这两个文件。看我的回答。
    • 你是对的,awk 能够处理两个/多个文件作为输入。你的答案最后需要sort
    【解决方案2】:

    没有|sort

    awk -F'|' '{O[$1FS$2]+=$3}END{asorti(O,T,"@ind_str_asc");for(t in T)print T[t] FS O[T[t]]}' file[1,2]
    

    【讨论】:

      【解决方案3】:

      只需将所有数据存储在两个数组a[]b[] 中,然后将它们打印回来:

      awk 'BEGIN{FS=OFS="|"}
           {a[$1]+=$3; b[$1]=$2}
           END{for (i in a) print i,b[i],a[i]}' f1 f2
      

      测试

      $ awk 'BEGIN{FS=OFS="|"} {a[$1]+=$3; b[$1]=$2} END{for (i in a) print i,b[i],a[i]}' f1 f2
      b | 16:00 |22
      c | 16:00 |37
      d | 16:00 |14
      a | 16:00 |24
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-17
        • 1970-01-01
        • 2016-10-08
        • 1970-01-01
        • 2016-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多