我有两个文件正在尝试比较,并使用这两个文件中存在的数据创建一个 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
瓶子上所说的那样:它对输入进行排序。