あるファイルから「キー属性」エントリを収集し、別のファイルのキーリストに追加します。

あるファイルから「キー属性」エントリを収集し、別のファイルのキーリストに追加します。

以下のように2つのファイルを受け取りました。最初のファイルには次のキーが含まれています。

1
2
3

2番目のファイルには、関連する単一の項目を持つキーが含まれています。

1  aa
2  ab 
3  ac
2 ad
1 ae
2 af 

同じキーに属するすべての項目を収集し、最初のファイルで定義された順序で1行に印刷したいと思います。

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番目のファイルが最初に処理され、同じ「キー」に関連するすべての「値」が収集されます。次に、最初のファイルを処理して各キーの「値」リストを出力します。

答え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

関連情報