我有这两个文件
File1:
9 8 6 8 5 2
2 1 7 0 6 1
3 2 3 4 4 6
File2 :(有超过400万行)
MN 1 0
JK 2 0
AL 3 90
CA 4 83
MK 5 54
HI 6 490
我想比较file1的字段6,并比较文件2的字段2.如果它们匹配,则将file2的字段3放在file1的末尾 我已经查看了其他解决方案,但我无法正常使用。
期望的输出:
9 8 6 8 5 2 0
2 1 7 0 6 1 0
3 2 3 4 4 6 490
我的尝试:
awk 'NR==FNR{a[$2]=$2;next}a[$6]{print $0,a[$6]}' file2 file1
程序刚刚挂起。
答案 0 :(得分:5)
要打印file1中的所有行(如果可用):
$ awk 'FNR==NR{a[$2]=$3;next;} {print $0,a[$6];}' file2 file1
9 8 6 8 5 2 0
2 1 7 0 6 1 0
3 2 3 4 4 6 490
仅打印匹配的行:
$ awk 'NR==FNR{a[$2]=$3;next} $6 in a {print $0,a[$6]}' file2 file1
9 8 6 8 5 2 0
2 1 7 0 6 1 0
3 2 3 4 4 6 490
请注意,我将a[$2]=$2
替换为a[$2]=$3
,并将测试a[$6]
(如果值为零,则为false)更改为$6 in a
。
答案 1 :(得分:1)
你自己的尝试基本上有两个错误,如@ John1024的答案所示:
a
中使用字段2作为键和值,您应该将字段3存储为值(因为您希望以后保留它),即它应该是a[$2] = $3
a[$6]
中的值为零时,即使它存在,测试a
也为false。正确的测试是$6 in a
。因此:
awk 'NR==FNR { a[$2]=$3; next } $6 in a {print $0, a[$6] }' file2 file1
但是,可能有更好的方法,但从您的规格中并不清楚。例如,您说file2
有超过400万行,但不知道字段2是否还有那么多唯一值。如果是,则a
将内存中也有很多条目。并且,您没有指定file1
的长度,或者是否必须保留其顺序以进行输出,或者是否应输出每一行(即使没有file2
中的匹配项)。
如果file1
的行数少于file2
的字符串具有字段2的唯一值,并且只需要输出匹配的行,并且不需要保留顺序,则您可能希望先阅读file1
...