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

时间:2017-03-31 14:16:26

标签: awk

我发现了与我类似的问题,但没有人帮我解决我的具体问题(而且我不确定是否真的有这么简单的解决方案......)

我有两个文件:

文件1:

a b c
d e f
g h i

file2的:

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中的项目并不总是具有相同数量的列。

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

谢谢!

2 个答案:

答案 0 :(得分:0)

使用以下方法:

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是关联数组的一个键,它会累积第二个文件中除前两列之外的所有列值(因为它们变为键/哈希)。对于前者对于第一个file2行,数组将被编入索引为a['ab']='x y z'

答案 1 :(得分:0)

这是另一个SELECT pr_products.product AS PRODUCT, pr_varieties.variety AS VARIETY, FORMAT(SUM(IF(pr_grades.grade='GOLD',pf_harvest.quantity,0)),0) AS GOLD, SUM(IF(pr_grades.grade='NORMAL',pf_harvest.quantity,0)) AS NORMAL, SUM(pf_harvest.quantity) AS TOTAL FROM pf_harvest INNER JOIN pf_performance ON pf_performance.id = pf_harvest.id_performance INNER JOIN pr_products ON pr_products.id = pf_harvest.id_product INNER JOIN pr_varieties ON pr_varieties.id = pf_harvest.id_variety INNER JOIN pr_grades ON pr_grades.id = pf_harvest.id_grade WHERE pf_performance.status = 100 AND pf_harvest.id_tenant = 1 AND pf_harvest.date = CURDATE() GROUP BY pf_harvest.id_product, pf_harvest.id_variety ORDER BY pf_harvest.id_product, pr_varieties.variety, pf_harvest.id_grade

awk

记下文件的顺序。