次のようなファイルがあります。
dee 123
bee 555
dee 56
cee 29
dee 30
cee 13
次のような出力が必要です。
dee 123,56,30
bee 555
cee 29,13
perlワンライナーを使用してこのタスクを実行するにはどうすればよいですか?
次のようなファイルがあります。
dee 123
bee 555
dee 56
cee 29
dee 30
cee 13
次のような出力が必要です。
dee 123,56,30
bee 555
cee 29,13
perlワンライナーを使用してこのタスクを実行するにはどうすればよいですか?
perl -alnwe '
push @{$a{$F[0]}}, $F[1];
}{
for (keys %a) { print $_, " ", join ",",@{$a{$_}} } ;'
出力:
cee 29,13
dee 123,56,30
bee 555
説明:
-a
空白で入力行を自動分割する-l
改行を処理する-n
while(<>)
ループアラウンドプログラムを想定@F
array は autosplit から取得$F[0]
さ$F[1]
れ、配列要素です。%a
結果を格納する場所です。最初の列はキーとして、2 番目の列は配列としての値です}{
スイッチでブロック-n
と同じことを行うエスキモー オペレーターEND
最後のセクションでは、キーと値を出力するだけです。
これにより、ほとんどの方法が得られます(「x」はファイル名です):
perl -ane 'm/^([^ ]+) +(\d+)/; if ($name{$1} ne "") { $name{$1} .= ","; }; $name{$1} .= $2; END { foreach (sort(keys(%name))) { print $_ . " " . $name{$_} . "\n"; } }' x
このワンライナーの出力:
bee 555
cee 29,13
dee 123,56,30