- ベストアンサー
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
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
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" } 出力ファイルはこんな風にプログラムに組み込みで固定にするのではなくて、リダイレクトで指定した方が柔軟です。
その他の回答 (1)
- maura
- ベストアンサー率46% (48/104)
CSV Parser http://lorance.freeshell.org/csv/csv.html 上記URLの内容を csv.awk として保存し csv.awk の 81行目から~101行目を書き換えて awk -f csv.awk data.csv と実行。 CSVってたいへ~ん。
お礼
回答有り難うございました。 UNIX初心者のため、内容を理解するのに時間がかかりますが、参考にさせていただきます。有り難うございました。
お礼
解決しました! $9=="\"1\"" ですね。有り難うございました!!
補足
回答有り難うございました。 実行してみたのですが、上手くゆかず、データを確認したところ、 抽出条件のデータの一部に、ダブルクォーテーションで囲まれた数値が存在することが分かりました。 ↓こういう場合はどのようにすれば良いのでしょうか? 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 ダブルクォーテーションが無い場合については、うまく行きました! 有り難うございます。