- ベストアンサー
awkについて
awkについて 今とあるファイルの/var/tmp/test 中の検索についてawkを使用しています。 123 abc 123-m 333 aaa-xx 1qwoko などタブキーで区切られています。 cat /var/tmp/test grep 123 | awk '$=="123"{print $2}' とやった場合存在するので 結果がでるのですが、その結果がない場合"NG"など文字列を出したいのですがどうすればいいでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
awk 'BEGIN{find=0}($0~/123/){print $2;find=1}END{if(find==0)print "NG\n"}' ファイル名 ではどうでしょうか? -------------------- a.txtの内容 123 abc 123-m 333 aaa-xx 1qwoko -------------------- # awk 'BEGIN{find=0}($0~/123/){print $2;find=1}END{if(find==0)print "NG\n"}' a.t xt abc 333 -------------------- b.txtの内容 23 abc 23-m 333 aaa-xx 1qwoko -------------------- # awk 'BEGIN{find=0}($0~/123/){print $2;find=1}END{if(find==0)print "NG\n"}' b. txt NG
その他の回答 (3)
- kmee
- ベストアンサー率55% (1857/3366)
まず、お使いのシェルはなんでしょうか? bash,kshの場合、 "\t" は無変換でそのまま、バックスラッシュとtになります。 $'\t' や $"\t" とすると、水平タブ文字に変換されます。 シングルクォートとダブルクォートは、それぞれ従来と同じです。 zshなら"\t"で水平タブ文字になります。 tcsh,cshでは、マニュアルにそれらしき記述が見つかりませんでした。 '\s','\t' (いずれも、バックスラッシュ+1文字)はgrepでは定義されていません。 [[:space:]]は、下を見る限り対応していそうなんですが。 http://www.kt.rim.or.jp/~kbk/regex/regex.html#GREP http://docs.sun.com/app/docs/doc/816-5175/regex-5?l=en&a=view
お礼
ありがとうございます。
- sakusaker7
- ベストアンサー率62% (800/1280)
> やりたいことは、1列目の文字列を完全一致で検索したいんです。 > '$1=="123" ああ、1 が抜けていたのですね。 > ちなみに、[[:space:]]や/tなどつかって後ろがタブ文字などつかってもなぜか、うまく取得できませんでした。 /t は \t のうち間違いではなく本当にそう入力したのですか? 昔のものだと本当にタブコードで入れないといけないものもありましたが Solarisのなら \t を受け付けると思うのですが。 [[:space:]] もだめというのもわかりませんねえ。確かに Solarisコマンドは 癖があるのが多いのですけど。
お礼
ありがとうございます。
補足
度々ありがとうございます。もう少し説明すると Solaris上のコマンドで grep "^123[実際にTABキーを入れる]" /ファイル名 これだと 123 xxxxxx などでます。 grep "^123\t" ~ だと表示されません。また grep "^123[[:space:]]"~ でも表示されませんでした。 単純に grep \t ~やgrep \s~のみだけだと、空白行?Tab?が含むものはすべて出てきました。 単純に書き方が悪いだけなのでしょうか?
- sakusaker7
- ベストアンサー率62% (800/1280)
>'$=="123" ここ、なにをしようとしているのでしょう? タブで区切られた行の先頭要素ですか? 行の先頭に123があるかどうかでいいのならawkを使わずに grep -e '^123' /var/tmp/test > /dev/null としてgrepのexit statusを見ればあったかどうかを確認できます。 2.3 Exit Status =============== Normally, the exit status is 0 if selected lines are found and 1 otherwise. But the exit status is 2 if an error occurred, unless the `-q' or `--quiet' or `--silent' option is used and a selected line is found. Note, however, that POSIX only mandates, for programs such as `grep', `cmp', and `diff', that the exit status in case of error be greater than 1; it is therefore advisable, for the sake of portability, to use logic that tests for this general condition instead of strict equality with 2.
お礼
ありがとうございます
補足
返信ありがとうございます。 やりたいことは、1列目の文字列を完全一致で検索したいんです。 '$1=="123" grep -e '^123' で実際にやってみると 123 xxxxx 123-xxx xxxxx 123abc aaaaa など出てきてしまい、-w,-eなどうまくつかえませんでした。 ちなみにOSはSolaris10上でやっています。 なにか単純に書き方がわるいだけなのでしょうか? もう少し教えていただけることがありましたら教えてください。 ちなみに、[[:space:]]や/tなどつかって後ろがタブ文字などつかってもなぜか、うまく取得できませんでした。
補足
返信ありがとうございます。 もう少し、質問があります。あまり、正規表現とかメタ文字とかがわかっていないのかもしれませんが。 このプログラムの意味をもう少し教えてください。 例えば、始めに私が記述した方法ですと、 1列目に"123"という文字列がある行の2列目がでてきますよね? abc これはなんかBIGINとかfindを使用してますがもう少し説明のほどお願いします。 find=0とfind==0とはどういういみでしょうか?