AWK:比较两个文件中的两个不同列

时间:2015-07-30 23:11:00

标签: awk

我有这两个文件

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

程序刚刚挂起。

2 个答案:

答案 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的答案所示:

  1. 您在a中使用字段2作为键和值,您应该将字段3存储为值(因为您希望以后保留它),即它应该是a[$2] = $3
  2. a[$6]中的值为零时,即使它存在,测试a也为false。正确的测试是$6 in a
  3. 因此:

    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 ...