複数の列があるタブ区切りのファイルがあります。列 A に表示される回数を追加し、列 A の値に関連付けられたデータを新しい列 B に出力したいと思います。
元:
1 blue
1 green
1 red
100 blue
100 red
出力ファイルには次のように記述します
3 1 blue,green,red
2 100 blue,red
awk または perl を使用してこれを行う方法はありますか?
答え1
awk の場合:
{
if (count[$1] == "") {
count[$1] = 1;
results[$1] = $2;
} else {
count[$1] = count[$1] + 1;
results[$1] = results[$1] "," $2;
}
}
END {
for (number in count) {
print count[number],number,results[number];
}
}
結果は次のようになります:
2 100 blue,red 3 1 blue,green,red
上記のサンプルデータの場合。
結果の順序はあなたが望むものとは少し違うかもしれませんが、それがあなたにとってどれほど重要であるかはわかりません。
答え2
私が試してみた方法は次のとおりです。これはあなたにとっても役に立つかもしれません。注: "\011"
= タブ文字、" "
スペースの場合は に変更)
awk 'BEGIN { s = "\011"; c = "," ; cnt = 0; all_colors = "" } {
if ( NR == 1 ) { num = $1; colors[cnt++] = $2 }
else {
if ( num != $1 ) {
for (x=0; x<cnt; x++) {
all_colors = all_colors colors[x]
}
print cnt s num s all_colors; cnt = 0; all_colors = ""
num = $1; colors[cnt++] = $2
}
else { colors[cnt++] = c $2 }
}
}
END {
all_colors = ""
for (x=0; x<cnt; x++) { all_colors = all_colors colors[x] }
print cnt s num s all_colors
}' tab_file
tab_file output
1 blue 3 1 blue,green,red
1 green 2 100 blue,red
1 red
100 blue
100 red