テキスト処理に sed/awk/perl を使用する

テキスト処理に sed/awk/perl を使用する

このパターンに似たテキスト行がたくさんあります。値と名前を1つの行にグループ化できますか?

ABCDEFG_10_node10:2154  ABCDEFG_10_node10:54
ABCDEFG_10_node10:2254  ABCDEFG_10_node10:64
ABCDEFG_10_node10:410 ABCDEFG_10_node10:10
ABCDEFG_10_node10:210 ABCDEFG_10_node10:10 
ABCDEFG_10_node10:365
ABCDEFG_10_node10:890
ABCDEFG_10_node10:741
XXYZZ_71_node2:24: XXYZZ_71_node2:504:
X3y5z_53_node1:664: X3y5z_53_node1:990:
RCTY_11_node2:224: RCTY_11_node2:234:

予想出力:

ABCDEFG_10_node10: 2154,2254,410,210,365,890,741,54,64,10,10
XXYZZ_71_node2: 24,504
X3y5z_53_node1: 664,990
RCTY_11_node2: 224,234

私はAIXを使用しています。どうすればいいですか?

ベストアンサー1

Perlアプローチ(順序は重要ではないと仮定):

$ perl -lne 'while(/(\w+):(\d+)/g){
                push @{$k{$1}},$2
             } 
             END{
                print "$_: " . join ",", @{$k{$_}} for keys %k
             }' file 
ABCDEFG_10_node10: 2154,54,2254,64,410,10,210,10,365,890,741

入力ファイルを 1 行ずつ読み込み、-lnで提供されたスクリプトを実行します-e。空でないすべてのインスタンスがwhile(/(\w+):(\d+)/g)収集され、空で:ないインスタンスがさらに収集されます。かっこ内に含まれているのでこれが$1名前と$2値になります。その後、%k値が配列であるハッシュ配列にプッシュされます。最後に、ハッシュの各キー(名前)とその値の配列を印刷して渡します,

簡潔さを重視する場合は、上記の内容を1行で書くことができます。

perl -lne 'while(/(\S+):(\S+)/g){push @{$k{$1}},$2}}{$"=",";print"$_: @{$k{$_}}" for keys%k' file

読みやすさを超えて:

perl -nE'push@{$k{$1}},$2while/(\w+):(\d+)/g}{$"=",";say"$_: @{$k{$_}}"for keys%k' file

おすすめ記事