プロが教える店舗&オフィスのセキュリティ対策術

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まとめにすることは可能でしょうか?

A 回答 (4件)

こんにちは。



QNo.4160141 『テキスト編集』

こちらとほぼ同様のご質問かもしれません。Perl や Awk の実現例が紹介されていますので合わせてお役立てください。

参考URL:http://okwave.jp/qa4160141.html
    • good
    • 0

> 重ね重ねのご回答、どうもありがとうございました。



「可能か不可能か」というご質問かと思いましたので「可能である」との証明に
拙いコードを記述させて頂きました。
ですので、コメントや解説も付けてなくて申し訳ありません。

> 「連想配列」という配列の使い方みたいですね。

はい、そうです。

> awkを始めたばかりの私にとっては、とても新鮮な考え方でした。

適当なロジックで拙いコードなので、特に始めたばかりと仰られるのなら
悪い例として見なかったことにしてください。

> shellと同様、awkの参考書って販売されているのでしょうか?

参考になる書籍は「AWK」の名前の由来になった方々が原著となっているものが
よろしいのではないかと思います。
アマゾンなどのサイトで「AWK」というキーワードで検索すれば見つかると
思います。
    • good
    • 0

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;
 }
}
    • good
    • 0
この回答へのお礼

重ね重ねのご回答、どうもありがとうございました。

これは「連想配列」という配列の使い方みたいですね。
awkを始めたばかりの私にとっては、とても新鮮な
考え方でした。
shellと同様、awkの参考書って販売されているのでしょうか?

お礼日時:2008/03/16 12:32

もっと良い記述方法が多くあるかと思われますが……


アルゴリズムとか簡潔さとか全く考えなくてよろしいのであればこのような感じに実現できるのではないでしょうか?

※ 一行で書いたため変数名が適当ですが 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
    • good
    • 0
この回答へのお礼

早速のご回答、どうもありがとうございました。
awkの勉強を始めたばかりですので、
1つ1つの処理を確認していきます。

お礼日時:2008/03/16 12:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!