- 締切済み
shell(awk)でファイル内の同一キーをグループ化
shell(awk)のご相談です。 (キー項目) (データ) キー1 列2データ(1) キー1 列2データ(2) キー1 列2データ(3) キー2 列2データ(1) キー2 列2データ(2) というデータがあり、これを キー1 列2データ(1) 列2データ(2) 列2データ(3) キー2 列2データ(1) 列2データ(2) というように、キー項目(1列目)が同じ行ごとに データ(列2)を1まとめにすることは可能でしょうか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- iriyak
- ベストアンサー率48% (40/82)
こんにちは。 QNo.4160141 『テキスト編集』 こちらとほぼ同様のご質問かもしれません。Perl や Awk の実現例が紹介されていますので合わせてお役立てください。
- x415f484f
- ベストアンサー率71% (57/80)
> 重ね重ねのご回答、どうもありがとうございました。 「可能か不可能か」というご質問かと思いましたので「可能である」との証明に 拙いコードを記述させて頂きました。 ですので、コメントや解説も付けてなくて申し訳ありません。 > 「連想配列」という配列の使い方みたいですね。 はい、そうです。 > awkを始めたばかりの私にとっては、とても新鮮な考え方でした。 適当なロジックで拙いコードなので、特に始めたばかりと仰られるのなら 悪い例として見なかったことにしてください。 > shellと同様、awkの参考書って販売されているのでしょうか? 参考になる書籍は「AWK」の名前の由来になった方々が原著となっているものが よろしいのではないかと思います。 アマゾンなどのサイトで「AWK」というキーワードで検索すれば見つかると 思います。
- x415f484f
- ベストアンサー率71% (57/80)
ANo.1 ですが、読みにくいので僅かだけ修正して全角文字でインデントいたしました。 駄文や愚答で資源を無駄にしてしまい、申し訳ありません。 #!/usr/bin/awk -f BEGIN{ FS=" "; num = 1; } { if( $1 != "" ) { keys[$1] = $1; data[$1,num] = $1 " " $2; num++; } } END{ for(key in keys) { line = key; for( i in data ) { split( data[i], s, " "); if ( s[1] == key ) { line = line " " s[2]; } } print line; } }
- x415f484f
- ベストアンサー率71% (57/80)
もっと良い記述方法が多くあるかと思われますが…… アルゴリズムとか簡潔さとか全く考えなくてよろしいのであればこのような感じに実現できるのではないでしょうか? ※ 一行で書いたため変数名が適当ですが bash 3.0(linux) では次のようにすれば動作しました。 awk 'BEGIN{a=1;}{b[$1]=$1;c[$1,a]=$1" "$2;a++;}END{for(d in b){e=d;for(i in c){split(c[i],s);if(s[1]==d){e=e" "s[2];}}printf"%s\n",e;}}' < data
お礼
早速のご回答、どうもありがとうございました。 awkの勉強を始めたばかりですので、 1つ1つの処理を確認していきます。
お礼
重ね重ねのご回答、どうもありがとうございました。 これは「連想配列」という配列の使い方みたいですね。 awkを始めたばかりの私にとっては、とても新鮮な 考え方でした。 shellと同様、awkの参考書って販売されているのでしょうか?