基于一列合并两个文件 awk

Ank*_*nkP 4 awk

我正在尝试合并两个制表符分隔的文件文件 - 它们的长度不等。我需要根据第 1 列合并文件,并将每个文件的第 3 列中的值获取到新文件中。如果任何文件缺少任何 id(不常见值),那么它应该在新文件中获得一个空白值 -

File1: 
id1 2199 082
id2 0909 20909
id3 8002 8030
id4 28080 80828

File2:

id1 988 00808
id2 808 80808
id4 8080 2525
id6 838 3800

Merged file :

id1 082 00808
id2 20909 80808
id3 8030  
id4 80828 2525
id6   3800
Run Code Online (Sandbox Code Playgroud)

我浏览了许多论坛和帖子,到目前为止我有这个

awk -F\t 'NR==FNR{A[$1]=$1; B[$1]=$1; next} {$2=A[$1]; $3=B[$1]}1'
Run Code Online (Sandbox Code Playgroud)

但它没有产生正确的结果,任何人都可以提出建议。多谢!

Joh*_*024 6

$ awk -F'\t' 'NR==FNR{A[$1]=$3; next} {A[$1]; B[$1]=$3} END{for (id in A) print id,A[id],B[id]}' OFS='\t' File1 File2 | sort
id1     082     00808
id2     20909   80808
id3     8030
id4     80828   2525
id6             3800
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

此脚本使用两个变量。对于 File1 中的每一行,关联数组A都有一个对应于第三个字段的 id 和值的键。对于 File2 中的每个 id,A也有一个键(但不一定是一个值)。对于 File2,数组B的每个 id 都有一个键,其中包含第三列中的相应值。

  • -F'\t'

    这将输入时的字段分隔符设置为选项卡。请注意,\t必须引用以保护它免受外壳程序的影响。

  • NR==FNR{A[$1]=$3; next}

    这将设置A第一个文件的关联数组。

  • A[$1]; B[$1]=$3

    这为第二个文件设置关联数组。它还确保数组A对 file2 中的每个 id 都有一个键。

  • END{for (id in A) print id,A[id],B[id]}

    这将打印出结果。

  • OFS='\t'

    这将输出字段分隔符设置为选项卡。

  • sort

    awk 结构for key in array不能保证以任何特定顺序返回键。我们使用sortid 将输出按升序排序。