use*_*110 4 awk text-processing
我有两个要比较的文件,并使用这两个文件中存在的数据创建一个 final.txt 文件。
File1 - 第 1 列和 File2 - 第 2 列包含我需要在两个文件之间匹配的值。
所以本质上,我试图 -> 从 File1 中获取 column1,如果 file2 的 column2 中存在匹配,则将 File1Column1、File1Column2 和 File2Column1 写入名为 final.txt 的新文件。
例子
文件 1
1000,Brian
1010,Jason
400,Nick
Run Code Online (Sandbox Code Playgroud)
档案 2
3044 1000
4466 400
1206 1010
Run Code Online (Sandbox Code Playgroud)
Final.txt 文件看起来像
1000,Brian,3044
1010,Jason,1206
400,Nick,4466
Run Code Online (Sandbox Code Playgroud)
我相信我应该能够用 awk 来做到这一点,但出于某种原因,我真的在为这个而苦苦挣扎。任何帮助将不胜感激。
谢谢
这是一种方法:
$ 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
Run Code Online (Sandbox Code Playgroud)
该-F"[, ]"字段分隔符设置为空格或逗号。FNR是当前行号和NR当前文件的当前行号。只有在读取第一个文件时,两者才会相等。因此,NR==FNR{a[$1]=$1","$2; next}将仅在第一个文件的行上运行,并将第一个和第二个字段(中间有逗号)保存为a键为第一个字段的数组中的值。然后,当读取第二个文件时,如果第二个字段在 中a,我们打印与其关联的值(第一个文件的第一个和第二个字段)和第二个文件的第一个字段。
也就是说,实际上有一个应用程序!这种东西就是join为此而生的。可悲的是,由于您的两个文件未排序且具有不同的分隔符,因此我们需要一些技巧。如果您的外壳支持<(),您可以执行以下操作:
$ join -t, -1 1 -2 2 <(sort file1) <(sed 's/ /,/g' file2 | sort -t"," -k2)
1000,Brian,3044
1010,Jason,1206
400,Nick,4466
Run Code Online (Sandbox Code Playgroud)
该join -t, -1 1 -2 2方法,用作分隔符并连接到文件 1 的第一个字段和文件 2 的第二个字段。在sed刚刚替换用逗号空间,所以我们必须在这两个文件中相同的分隔符。Thesort执行它在瓶子上所说的:它对输入进行排序。