我有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
您应该指定字段分隔符FS
并OFS
用于输出字段分隔符。
awk 'BEGIN { FS=OFS="," }
NR==FNR { saving[$1]=$2; next }
($1 in saving){ print $1, saving[$1], $2 }' file1 file2
答案2
您的代码的问题awk
主要有两个:
- 您不指示
awk
用作,
字段分隔符。您可以使用 来执行此操作-F ,
。 - 您永远不会测试数组
$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)