在Linux中逐字段比较两个文件

时间:2012-06-12 16:07:47

标签: linux awk

我试图比较两个文件(用逗号和空格分隔)使用3个字段(字段1,2,5来自file1和1,2,5来自file2)如果两个文件匹配我想要整个file2的记录使用awk与file1的最后一个字段连接。例如 文件1:

1, 4, abebe, kebede, 25, 101, 42
1, 4, abebe, debebe, 42, 201, 47
1, 4, abebech, kebede, 17, 33, 57

file2的:

1, 4, abebe, kebede, 25, 101, 42
1, 4, Tesse, debo, 25, 101, 42
1, 4, derartu, tulu, 25, 101, 42

输出:

42, 1, 4, abebe, kebede, 25, 101, 42
47, 1, 4, Tesse, debo, 25, 101, 42
57, 1, 4, derartu, tulu, 25, 101, 42

我是linux新手......任何帮助都是适用的

2 个答案:

答案 0 :(得分:1)

我对问题的第一次阅读有助于解决这个问题:

awk '{getline t < "file2"; split( t, a );
    if( a[1]a[2]a[5] == $1$2$5) print $NF",", t}' file1

但似乎问题实际上是:'给定file1我们知道任何记录,其中字段1,2和4是相同的,最终字段也是相同的,找到所有行file2具有相应的字段1,2和4,并输出该行,其中file1的最后一个字段位于前面。在这种情况下,丹尼斯给出的解决方案是有效的。

答案 1 :(得分:1)

由于文件1中记录1的字段1,2和5匹配 all 文件2中的记录,因此我以相反的顺序将文件列为参数,以获得所需的输出。

awk 'BEGIN {OFS = ", "} NR == FNR {a[$1, $2, $5] = $NF; next} $1 SUBSEP $2 SUBSEP $5 in a {print a[$1, $2, $5], $0}' file2 file1

NR == FNR块形成一个循环,该循环将参数列表中首先出现的文件读入数组。当记录号(NR)和文件记录号(FNR)不再相等时,处理继续到名为第二个参数的文件。

在那里,检查数组以查看两个文件中的字段是否匹配。如果是,则输出相应的保存字段和当前记录。