我得到了如下 2 个文件。第一个文件包含密钥:
1
2
3
第二个文件包含具有关联单个条目的密钥:
1 aa
2 ab
3 ac
2 ad
1 ae
2 af
我想收集属于同一键的所有条目,并按照第一个文件定义的顺序将它们打印在一行上:
1 aa ae
2 ab ad af
3 ac
有人可以帮忙吗
答案1
尽管确实有可能使用 来做到这一点miller
,但awk
我想到了一个基于 - 的解决方案:
awk 'NR==FNR{if ($1 in map) map[$1]=map[$1] OFS $2; else map[$1]=$2; next}
{print $1,map[$1]}' file2.txt file1.txt
这将首先处理第二个文件并收集与同一“键”关联的所有“值”。然后它将处理第一个文件以将“值”列表输出到每个键。
答案2
以及 Perl 方法:
perl -e 'while(<>){
chomp;
@fields = split(/\s+/);
push @{$values{$fields[0]}},$fields[1];
}
foreach $value (sort keys(%values)){
print "$value @{$values{$value}}\n"
}' file2
或者,如果您喜欢打高尔夫球,也可以这样做:
$ perl -lane 'push@{$k{$F[0]}},$F[1]}{print"$_ @{$k{$_}}"for sort keys %k' file2
1 aa ae
2 ab ad af
3 ac
然后,要仅打印在 中找到的值file1
,您可以将其传递给grep
:
$ perl -lane 'push@{$k{$F[0]}},$F[1]}{print"$_ @{$k{$_}}"for keys %k' file2 |
grep -wf file1
1 aa ae
2 ab ad af
3 ac