【问题标题】:awk merge two columns by key, joining valuesawk 键合并两列,连接值
【发布时间】:2014-05-22 22:26:52
【问题描述】:

这是我的两个输入文件:

file1.txt
1   34
2   55
3   44
6   77

file2.txt
1   12
2   7
5   32

我希望我的输出是:

1   34   12
2   55   0
3   44   0
5   0   32
6   77   0

我需要在 awk 中执行此操作,虽然我能够合并文件,但我不知道如何在不丢失信息的情况下执行此操作...

awk -F"\t" 'NR==FNR {h[$1] = $2; next }{print $1,$2,h[$2]}' file1.txt file2.txt > try.txt
awk  '{ if ($3 !="") print $1,$2,$3; else print $1,$2,"0";}' try.txt > output.txt

输出是:

1   34   12
2   55   7
3   44   0
6   77   0

对不起,我知道这一定很容易,但我在这个世界上还很陌生!请问我需要帮助!!!提前致谢!!

【问题讨论】:

    标签: bash awk merge


    【解决方案1】:

    此命令为您提供所需的输出:

    awk 'NR==FNR{a[$1]=$2;next}
        {if($1 in a){print $0,a[$1];delete a[$1]}
            else print $0,"0"}
        END{for(x in a)print x,"0",a[x]}' file2 file1|sort -n|column -t
    

    请注意,我使用 sortcolumn 对输出进行排序和格式化。

    输出:(注意我猜2 55 0 是您预期输出中的错字)

    1  34  12
    2  55  7
    3  44  0
    5  0   32
    6  77  0
    

    【讨论】:

      【解决方案2】:

      这是使用joinawk 的另一种方式:

      join -a1 -a2 -o1.1 2.1 1.2 2.2 -e0 file1 file2 | awk '{print ($1?$1:$2),$3,$4}' OFS='\t'
      1   34  12
      2   55  7
      3   44  0
      5   0   32
      6   77  0
      
      • -a 开关允许加入不可配对的线路。
      • -o 构建我们的输出格式
      • -e 允许指定不存在的值应该打印什么
      • awk 刚刚完成最后的格式化。

      【讨论】:

      • 你可以打你的awk 一些。 awk '{print ($1?$1:$2),$3,$4}' OFS="\t"
      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2020-09-01
      相关资源
      最近更新 更多