Awk 比较两个文件中的列,附加共享项的数据,并打印第一个文件中的非共享项

Awk 比较两个文件中的列,附加共享项的数据,并打印第一个文件中的非共享项,awk,Awk,我发现了与我类似的问题,但没有一个对我的具体问题有帮助(我不太确定是否真的有这么简单的解决方案……) 我有两个文件: 文件1: a b c d e f g h i 文件2: a b x y z d e x f h i 期望输出: a b c x y z d e f x g h i 因此,我需要文件1中的所有行和列,此外,如果文件2中的前两列匹配,我希望将这些列(来自文件2)的其余列附加到文件1中的列,并将其写入新文件 我尝试过使用awk,但到目前为止,我只为那些匹配的行添加了列,但其他行(

我发现了与我类似的问题,但没有一个对我的具体问题有帮助(我不太确定是否真的有这么简单的解决方案……)

我有两个文件:

文件1:

a b c
d e f
g h i
文件2:

a b x y z
d e x
f h i
期望输出:

a b c x y z
d e f x
g h i
因此,我需要文件1中的所有行和列,此外,如果文件2中的前两列匹配,我希望将这些列(来自文件2)的其余列附加到文件1中的列,并将其写入新文件

我尝试过使用awk,但到目前为止,我只为那些匹配的行添加了列,但其他行(在我的示例中是“g,h,I”行)没有打印出来。 另一个问题似乎是文件2中的项并不总是具有相同数量的列

有人知道如何解决这个问题吗


谢谢大家!

使用以下方法:

awk 'FNR==NR{k=$1$2; $1=$2=""; a[k]=$0; next}
     { if($1$2 in a){print $0a[$1$2] } else print $0}' file2 file1 | tr -s ' '
输出:

a b c x y z
d e f x
g h i

FNR==NR
-确保执行第一个文件


k=$1$2
-
k
是关联数组的键,它累加第二个文件中除前两列之外的所有列值(当它们成为键/散列时)。例如,对于第一个
文件2
行,数组将被索引为
a['ab']='x y z'
这里是另一个
awk

 awk        '{k=$1 FS $2} 
     NR==FNR {sub(k,"",$0); a[k]=$0; next} 
     k in a  {$0 = $0 a[k]}1' file2 file1

a b c x y z
d e f x
g h i

请注意文件的顺序。

您是否尝试过解决问题?如果您发布尝试的解决方案并获得错误反馈,您将受益更多。谢谢!你能解释一下吗?k到底是什么意思?不幸的是,我的输出是,文件1中的第三个元素在文件2添加之后追加到最后。请注意,此方法可能会产生不幸的副作用。假设行以
a ab…
aa b…
开头。如果键的长度不变或字段类型不同(例如,一个字母,另一个数字),则您的解决方案是正确的。只要按照我的建议尝试另一个输入文件,您就会看到我提出的问题。@karakfa,您针对不幸的副作用的解决方案/建议是什么?可以像在我的解决方案中一样在字段之间使用字段分隔符,或者使用
($1,$2)
符号使用隐式多维数组字段分隔符。