• ベストアンサー

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

  • awkやsed等で特定の文字間を抜き出す

    cat text aaaa bbbb <AAA> ccc ddd <BBB> eee とあるときに <AAA> ccc ddd <BBB> だけ抜き出したいです。 どのようにすればよいでしょうか?

  • SpreadのデータをCSVに出力する際。。。

    いつもお世話になっております。 現在SpreadのデータをCSVに出力するプログラムを作成しています。 例えば、Spreadのデータに… ------------------- AAA BBB CCC DDD BBB DDD ------------------- というデータが入っている場合、 CSVには… ------------------- AAA BBB CCC DDD ------------------- という風に出力したい(重複した場合は一方だけ出力)のですが、 なかなかうまくいきません(汗) どのようなプログラムを組めばうまくいくか、 ご教授して頂ければ幸いです。 宜しくお願いします。 ※そのままCSVに出力するやり方はわかります。

  • DOSプロンプトのテキストファイルから取得したフィールドがデータ無しの場合の認識方法

    CSVファイルから各フィールドを取得し、なにも入っていない場合は固定値を入れると言う処理を、DOSのコマンドプロンプトによるバッチで行ってほしいと言うユーザ要望に答えなくてはなりません。 【入力ファイル】 <<AAA.csv>> aaa,,bbb,,ccc,ddd iii,jjj,kkk,lll,mmm,nnn eee,,fff,,ggg,hhh このAAA.csvを入力情報にして、 カンマ区切りの何も入っていないフィールドを認識し、 上記ファイルで言うと、 各行の2項目に何も入っていない場合は222を、 各行の4項目に何も入っていない場合333を入れる、 と言う処理を作る必要があります。 上記に説明した処理での出力結果は以下の様になります。 【出力ファイル】 <<BBB.csv>> aaa,222,bbb,333,ccc,ddd iii,jjj,kkk,lll,mmm,nnn eee,222,fff,333,ggg,hhh forやsetを駆使してフィールドの取得や変換は出来たのですが、 取得したフィールドに何も入っていなかった場合に固定値を入れる処理で行き詰っています。 何か良い方法があれば教えてください。 ちなみに入力や出力ファイルはタブ区切りのTSVファイル形式の場合もあります。 又環境は、銀行のサーバで実装するのでフリーソフトはもちろんparlやWSH等のインストールも許されていない為、DOSプロンプトコマンドによるバッチ処理のみで行う必要があります。 宜しくお願いします。

  • 大量のCSVデータを1つのエクセルデータにまとめる方法について

    今仕事で、CSVファイルが400ファイル程あり、これを一つの エクセルファイルにまとめなくて加工しなければならないのですが うまいことVBAを活用して効率的にできないか思案中なのですが うまい具合に行きません。 データの持ち方として ○CSVファイル1 1.AAA 2.BBB ○CSVファイル2 3.CCC 4.DDD となっており、これを1つのエクセルファイル上で 1.AAA 2.BBB 3.CCC 4.DDD としたいのですがなにかいい方法はないでしょうか? 1つのブックで外部データの取り込みでCSVを次々に選択して いくVBAなんてあれば教えていただけないでしょうか? よろしくお願いします。

  • CSVに外部テキストファイルを列として追加する方法

    こんにちは。 CSVファイル(base.csv)の先頭列に、別のテキストファイル(add.txt)の中身を新規の列として挿入したいと考えているのですが、よい方法がわかりません。。。 どうのような方法を使えば対応することができるでしょうか? どうぞよろしくお願いいたします。 ■CSVファイル(master.csv) title,developer_name,seller_name,primary_genre_name,application_url AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE ■テキストファイル(add.txt) id 000 111 222 333 ↓ ■目標としたファイル(master.csv) id,title,developer_name,seller_name,primary_genre_name,application_url 000,AAA,BBB,CCC,DDD,EEE 111,AAA,BBB,CCC,DDD,EEE 222,AAA,BBB,CCC,DDD,EEE 333,AAA,BBB,CCC,DDD,EEE

  • CSVファイルをAccessに取りこみたい

    以下のような2つのCSVファイルがあるとします。 【hoge1.csv】 aaa,bbb,ccc,ddd 1,2,3,4 【hoge2.csv】 aaa,bbb,ddd,eee,fff 1,2,4,5,6 Accessをあまり使用したことがないので教えていただきたいのですが、 hoge1.csv、hoge2.csvを、以下のような形で Accessの1つのテーブルにインポートする事はできるのでしょうか? ---------------------------- | aaa | bbb | ccc | ddd | eee | fff | | 1 | 2 | 3 | 4 |  |  | | 1 | 2 |  | 4 | 5 | 6 | ---------------------------- ※「aaa」「bbb」…をフィールド名としたいです vb等でプログラムを自作するしかないのでしょうか? 何か良い方法がありましたら教えてください。お願いします。

  • unixで特定カラムを抽出しuniqするには?

    例えば下記のようなファイルが存在するとします。 nkhkl aaa lkijh nkahk aaa nhjjk nnvaj bbb hdjup hfkaj bbb nhaja uiqju ccc ujaij yyajy ccc ikauk quqju ccc udjak ayjew ddd aujul tqyhd ddd uajuy 上記ファイルの各行の第2項 だけを取り出し、さらにuniqさせたいのですが やり方がわかりません。 最終的には aaa bbb ccc ddd というように加工したいです。 これをコマンドライン、しかもunixコマンドを使って一気に 加工するコマンドを教えてください。

  • 【少し急いでます】エクセルについて教えてください!

    Excel2000を使っています。 A列に重複するデータがあり、B列に別データがあります(20000行強) 例)     A  B 1  001 aaa 2   001 bbb 3   001 ccc 4   002 aa 5  002 bb 6  003 aaa 7  003 bbb 8  004 ddd 9   004 eee 10  005 aa 11  006 bbb A列で重複する001は3行あり、重複しているデータは1行にまとめてB列のaaa、bbb、cccをつなげたいです。(わかりづらくてすみません) 例)     A      B 1  001  aaa・bbb・ccc 2  002   aa・bb 3  003  aaa・bbb というようにまとめたいです。 どのような方法がありますでしょうか? よろしくお願い致します。

  • シェルで特定行を処理する方法を教えてください。

    初めてご質問させていただきます 数時間考えましたが、全くできない初心者です。 awkとかも使ってみましたが・ちんぷんかんぷんです。 よろしくお願いいたします。 環境:RedHat、シェル:bash [やりたいこと] 特定の文字以外から始まる行を、 特定文字から始まる行へ連結させたい。 (例  aaaから始まっていない行(bbb、ccc、ddd)を、  aaaから始まる行へ出力させる。 ■元となるテキストファイル ============ aaa bbb ccc ddd aaa aaa aaa eee aaa ============ ■整形後のファイル ============ aaabbbcccddd aaa aaa aaaeee aaa ============

  • 2つの条件に完全合致するデータ件数の出し方 (Excel)

    下記【↓データ元】ようにカンマ区切りされているデータがあり、任意の2つの条件に合致するデータ数をマトリクス表形式で埋め込みたいと考えています。 完全一致するデータのみカウント対象とするので(ex.CCC(株)等、条件文字に追加文字があるようなものは除く)、splitで配列に入れてfindで一つ一つ検索していくしかないでしょうか? (データ数が多いと、処理時間がとてもかかるので・・・。) 私が行いたいと思っていた解決策に直結するような下記サイトがあったのですが、これだと条件文字が含んでいればカウント対象(ex.CCC(株)等、条件文字に追加文字があるものも対象)となってしまうので、ご助言いただきたく書き込みしました。 何かアドバイスがありましたら、宜しくお願いいたします。 【↓参考になりそうだと思われたサイト】 http://ohpa.net/modules/xlnote/content0166.html 【↓データ元】 AAA BBB,CCC DDD CCC,AAA AAA,CCC BBB 【↓出力イメージ】    AAA BBB CCC DDD AAA 1 0 2 0 BBB 0 1 1 0   CCC 2 1 0 0 DDD 1 0 0 0

専門家に質問してみよう