使用公共列合并两个文件

使用公共列合并两个文件

我有2个文件。

文件1是:

burnj01,Joe Burns
steves02,Santosh Steve

文件2是:

burnj01,0001
burnj01,0002
burnj01,0010
burnj,0100
burnj01,2000
steves02,2048
steves02,2049
steves02,2091

我想要一个像这样的文件 3:

burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,0100
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091

我想使用第一个文件的 col1 组合这两个文件,并在匹配时将 File2 中的第 2 列的值添加到 File1 的最后一列。

我试过这个:

$ awk 'FNR==NR{a[$1]=$2;next} {print $1,$2,a[$1]}' file2 file1 > file3

但这不起作用。我该如何实现这一目标?

答案1

您应该指定字段分隔符FSOFS用于输出字段分隔符。

awk 'BEGIN        { FS=OFS="," }
     NR==FNR      { saving[$1]=$2; next }
    ($1 in saving){ print $1, saving[$1], $2 }' file1  file2

答案2

您的代码的问题awk主要有两个:

  1. 您不指示awk用作,字段分隔符。您可以使用 来执行此操作-F ,
  2. 您永远不会测试数组$1中是否有键a。您可以将其$1 in a作为代码最后一个块之前的条件来执行此操作。如果您希望第二个文件中的所有名称都出现在第一个文件中(但您对此没有说什么),则可以跳过此步骤。

与预期输出相比,您似乎还以错误的顺序输出字段,并且您使用默认的输出分隔符,即空格,而不是逗号(OFS = ","或块OFS = FS中的 ,BEGIN可以解决此问题)。

$ awk -F , 'BEGIN { OFS = FS } FNR == NR { names[$1] = $2; next } ($1 in names) { print $1, names[$1], $2 }' file1 file2
burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091

$ join -t, <( sort file1 ) <( sort file2 )
burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091

这会对两个文件进行排序并将排序后的内容传递给join实用程序。该join实用程序在第一列(默认情况下)上的两个数据集之间执行关系 JOIN 操作,INNER JOIN如果您熟悉 SQL,则本质上是一个 。我们使用-t ,withjoin告诉它列是用逗号分隔的。

如果您的 shell 不理解<( ... )进程替换,请对数据进行预排序。该join实用程序需要排序的输入。

sort -o file1.sorted file1
sort file2 | join -t, file1.sorted -
rm -f file1.sorted

答案3

加入是必经之路:

join -t, <(sort file1) <(sort file2)

相关内容