Bash awk通过键合并两列,连接值

Bash awk通过键合并两列,连接值,bash,awk,merge,Bash,Awk,Merge,这是我的两个输入文件: file1.txt 1 34 2 55 3 44 6 77 我希望我的成果是: 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 a

这是我的两个输入文件:

file1.txt
1   34
2   55
3   44
6   77
我希望我的成果是:

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

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

此命令提供所需的输出:

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
注意,我使用了
sort
column
对输出进行排序和格式化

输出:(注意我猜
2550
是您预期输出中的一个输入错误)


下面是使用
join
awk
的另一种方法:

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
  • -一个
    开关允许在不可配对的线路上进行连接
  • -o
    构建我们的输出格式
  • -e
    允许为不存在的值指定应打印的内容
  • awk
    刚刚完成最终格式化

你可以打你的
awk
一些高尔夫球<代码>awk'{print($1?$1:$2),$3,$4}'OFS=“\t”
1  34  12
2  55  7
3  44  0
5  0   32
6  77  0
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