このパターンに似たテキスト行がたくさんあります。値と名前を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