0

我正在尝试使用 3 个字段(来自 file1 的字段 1、2、5 和来自 file2 的 1、2、5)比较两个文件(用逗号和空格分隔),如果这两个文件匹配我希望 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

文件2:

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 新手.... 任何帮助都会得到帮助

4

2 回答 2

1

由于文件 1 中记录 1 的字段 1、2 和 5 与文件 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) 不再相等时,继续处理被命名为第二个参数的文件。

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

于 2012-06-12T16:25:39.577 回答
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前置的最后一个字段的那一行。在这种情况下,丹尼斯给出的解决方案有效。

于 2012-06-12T16:17:07.560 回答