-6

次のようなファイルがあります。

dee    123    
bee    555    
dee    56    
cee    29    
dee    30    
cee     13

次のような出力が必要です。

dee  123,56,30    
bee  555    
cee   29,13

perlワンライナーを使用してこのタスクを実行するにはどうすればよいですか?

4

2 に答える 2

2
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改行を処理する
  • -nwhile(<>)ループアラウンドプログラムを想定
  • @Farray は autosplit から取得$F[0]$F[1]れ、配列要素です。
  • %a結果を格納する場所です。最初の列はキーとして、2 番目の列は配列としての値です
  • }{スイッチでブロック-nと同じことを行うエスキモー オペレーターEND

最後のセクションでは、キーと値を出力するだけです。

于 2012-11-27T22:43:59.940 に答える
1

これにより、ほとんどの方法が得られます(「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
于 2012-11-27T22:22:23.980 に答える