我试图比较两个文件(用逗号和空格分隔)使用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新手......任何帮助都是适用的
答案 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
)不再相等时,处理继续到名为第二个参数的文件。
在那里,检查数组以查看两个文件中的字段是否匹配。如果是,则输出相应的保存字段和当前记录。