Awk - 匹配两个文件之间的值并创建一个新文件

Awk - 匹配两个文件之间的值并创建一个新文件

我有两个文件正在尝试比较,并使用这两个文件中存在的数据创建一个 Final.txt 文件。

File1 - 第 1 列和 File2 - 第 2 列包含我需要在两个文件之间匹配的值。

所以本质上,我试图->从File1中获取column1,如果file2的column2中有匹配项,则将File1Column1、File1Column2和File2Column1写入名为final.txt的新文件。

例子

文件1

1000,Brian
1010,Jason
400,Nick

文件2

3044 1000
4466 400
1206 1010

Final.txt 文件看起来像

1000,Brian,3044
1010,Jason,1206
400,Nick,4466

我相信我应该能够用 awk 做到这一点,但由于某种原因,我真的很难做到这一点。任何帮助将不胜感激。

谢谢

答案1

这是一种方法:

$ awk -F"[, ]" 'NR==FNR{a[$1]=$1","$2; next} ($2 in a){print a[$2]","$1}' file1 file2 
1000,Brian,3044
400,Nick,4466
1010,Jason,1206

-F"[, ]"字段分隔符设置为空格或逗号。FNR是当前行号和NR当前文件的当前行号。仅当读取第一个文件时,两者才会相等。因此,NR==FNR{a[$1]=$1","$2; next}将仅在第一个文件的行上运行,并将第一个和第二个字段(中间有逗号)保存为数组中的值,a其键是第一个字段。然后,当读取第二个文件时,如果第二个字段在 中a,我们打印与其关联的值(第一个文件的第一个和第二个字段)以及第二个文件的第一个字段。


也就是说,实际上有一个应用程序可以做到这一点!这种东西就是join为之而生的。遗憾的是,由于您的两个文件未排序并且具有不同的分隔符,因此我们需要一些技巧。如果你的 shell 支持<(),你可以这样做:

$ join -t, -1 1 -2 2 <(sort file1) <(sed 's/ /,/g' file2 | sort -t"," -k2) 
1000,Brian,3044
1010,Jason,1206
400,Nick,4466

join -t, -1 1 -2 2方法用作,分隔符并连接到 file1 的第一个字段和 file2 的第二个字段。只是sed用逗号替换空格,因此我们在两个文件中具有相同的分隔符。正如sort瓶子上所说的那样:它对输入进行排序。

相关内容