最初の列の値に基づいてすべてのファイルの内容をグループ化したいと思います。出力がソートされた形式であれば、より良いでしょう。
入力する:
1 foo
2 bar
1 foobar
2 barbar
3 apple
4 banana
3 mango
5 orange
予想出力:
1 foo, foobar
2 bar, barbar
3 apple, mango
4 banana
5 orange
答え1
私が正しく理解したなら、あなたは探しています
perl -lane 'push @{$k{$F[0]}},$F[1];
END{$"=", ";print "$_ @{$k{$_}}" for sort keys(%k)}' file
明示的に行を分割する理由はありません。フラグ-a
はこれを行います。各入力行を@F
配列に分割します。したがって、ここでは%k
キーが最初のフィールドで値が2番目のフィールドの対応するリストであるハッシュを作成します。次に、最後にハッシュキーを並べ替え、$"
リスト区切り記号()を設定し、各キー,[space]
とその値のリストを印刷します。
答え2
その他perl
:
$ perl -anle '
push @{$h{$F[0]}}, $F[1];
END {
for (sort {$a <=> $b} keys %h) {
print "$_ ", join(", ", @{$h{$_}});
}
}
' file
1 foo, foobar
2 bar, barbar
3 apple, mango
4 banana
5 orange
説明する
$h
キーが値のハッシュを作成します$F[0]
。各ハッシュ値は配列参照です。各行が処理されると、2番目のフィールドの値を配列$F[1]
参照に追加しますpush @{$h{$F[0]}}, $F[1]
。$h
すべての行を処理したら、キー()をソートし、各配列sort {$a <=> $b} keys %h
参照を文字列(join(", ", @{$h{$_}})
)に連結し、関連付けられた文字列に対応する各キーを印刷します。