以下のように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