• ベストアンサー

awkで検索し、特定のフィールドを抽出する方法

UNIX初心者です。 以下のようなデータファイル(AA.dat)から、条件を満たすデータの特定フィールドを別のファイル(BB.dat)に出力したいのです。 どのようにしたら良いのでしょうか? AA.dat(CSV形式) aaa,22,33,44,55,66,77,88,1,1,0,0,1001 bbb,22,33,44,55,66,77,88,1,1,0,0,1002 ccc,22,33,44,55,66,77,88,1,0,0,0,1001 ddd,22,33,44,55,66,77,88,1,1,0,0,1002 抽出条件(フィールド=$1~$13) $9==1 かつ $10==1 かつ $11==0 かつ $12==0 かつ $13==1002 出力するフィールド $1,$2,$4,$7,$8 出力結果 BB.dat(CSV形式) bbb,22,44,77,88 ddd,22,44,77,88

質問者が選んだベストアンサー

  • ベストアンサー
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

CSVに文字列が含まれている(区切り文字ではなくデータとしてのカンマがある)と、awkではかなりややこしくなりますが。それがないCSVならば、こんな感じで行けるでしょう。 BEGIN{FS=",";OFS=FS} $9==1 && $10==1 && $11==0 && $12==0 && $13==1002 { print $1,$2,$4,$7,$8 > "BB.dat" } 出力ファイルはこんな風にプログラムに組み込みで固定にするのではなくて、リダイレクトで指定した方が柔軟です。

sisizoo
質問者

お礼

解決しました! $9=="\"1\"" ですね。有り難うございました!!

sisizoo
質問者

補足

回答有り難うございました。 実行してみたのですが、上手くゆかず、データを確認したところ、 抽出条件のデータの一部に、ダブルクォーテーションで囲まれた数値が存在することが分かりました。 ↓こういう場合はどのようにすれば良いのでしょうか? AA.dat(CSV形式) aaa,22,33,44,55,66,77,88,"1","1",0,0,1001 bbb,22,33,44,55,66,77,88,"1","1",0,0,1002 ccc,22,33,44,55,66,77,88,"1","0",0,0,1001 ddd,22,33,44,55,66,77,88,"1","1",0,0,1002 ダブルクォーテーションが無い場合については、うまく行きました! 有り難うございます。

その他の回答 (1)

  • maura
  • ベストアンサー率46% (48/104)
回答No.2

CSV Parser http://lorance.freeshell.org/csv/csv.html 上記URLの内容を csv.awk として保存し csv.awk の 81行目から~101行目を書き換えて awk -f csv.awk data.csv と実行。 CSVってたいへ~ん。

sisizoo
質問者

お礼

回答有り難うございました。 UNIX初心者のため、内容を理解するのに時間がかかりますが、参考にさせていただきます。有り難うございました。

関連するQ&A

専門家に質問してみよう