【发布时间】:2016-10-15 02:49:28
【问题描述】:
所以我试图理解这个answer 使用awk 合并两个文件,我想出了我的解决方案来满足我的需求。
awk 'FNR==NR{a[$1]=$2 FS $3;next} {a[$1]=$2 FS $3}{ print a[$1]}' file2 file1
我的文件如下:-
file1和file2内容如下:-
1 xyz pqr F -
1 abc def A -
1 abc mno G -
1 abc def A
1 xyz pqr T
我期待如下输出:-
1 xyz pqr F - T
1 abc def A - A
基本上匹配file1 上file2 的第1、2、3 列,并将file2 上最后一列的内容打印附加到结果上。
所以我对解决方案的理解如下,
-
FNR==NR{a[$1]=$2 FS $3;next}将在file2上处理,将数组a的条目存储为 column2 空间 column3 直到file2结束。 - 现在在
file1上,我可以通过执行{a[$1]=$2 FS $3}来匹配file2中的那些行,这将为我提供file1中的所有行,其列$1的值a[$1]与column2 值相同$2空间列 3 值$3。现在问题来了。 - 在 file1 中匹配它们后,我不知道如何按预期打印这些值。我尝试打印
$0和a[$1],他们给了我
按顺序输出,
1 xyz pqr F -
1 abc def A -
xyz pqr
abc def
分别。我最大的担心是因为在FNR==NR 传递期间我没有从file2 捕获最后一列,我可能没有将值存储在我的数组中?还是我把它储存起来了?
【问题讨论】:
-
最好不要说
awk 'FNR==NR{a[$1 FS $2 FS $3]=$4;next} (($1 FS $2 FS $3) in a) {print $0, a[$1 FS $2 FS $3]}' f2 f1? -
@fedorqui:错过了
a[...]=$4的逻辑,这对我有帮助!请将其作为答案提供,以供参考!