收集一个文件中的“关键属性”条目并将其附加到另一文件中的关键列表

收集一个文件中的“关键属性”条目并将其附加到另一文件中的关键列表

我得到了如下 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

相关内容