• ベストアンサー

awkで一つマッチしたら終了させる

echo $var | awk '{ for (i = 0; i < NF; i++) { if ($i == "AAA") { j = i+1; print $j ; exit; } } }' として変数1"$var"から"AAA"という文字列を抜き出しているのですが $varに二個以上のAAAが存在するときに 一つめのAAAとマッチしたら終了としたいのです どの用にしたらよいでしょうか? ご教授お願いします。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>>とかあったら、どんな出力が欲しいのでしょうか? >BBBです。 であるなら、今のスクリプトでできてませんか? 少なくともわたしが試したところではBBBが でてきましたけど。 補足の内容から判断すると、 >"AAA"という文字列を抜き出しているのですが じゃなくて、AAAを鍵にしてその次にくる フィールドを抜き出してますよね。 なら for ループは for (i=1; i<NF-1; i++) { でしょう。 <=NFだと、最終フィールドにAAAがあると 空文字列が出力されます。 それでいいというならまあいいですけど。 で、うまくいかないパターンがあるなら、それを提示してもらえませんか?

nya1221
質問者

お礼

確かに。 うまくいきますね・・・(^^; 抱えていた問題の原因は 別な部分にありました。 申し訳ありません。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

ちと疑問に思ったのですが、 > for (i = 0; i < NF; i++) { なぜフィールド0(レコード全体)から始めているのか。最終フィールドを除外しているのか。 > if ($i == "AAA") { > j = i+1; print $j ; exit; なぜ比較に使ったフィールドの次のフィールドを 出力しようとしているのか? がナニを目的としているのかがわかりません。 たとえば $var に AAA BBB AAA CCC AAA とかあったら、どんな出力が欲しいのでしょうか?

nya1221
質問者

補足

> なぜフィールド0(レコード全体)から始めているのか。最終フィールドを除外しているのか。 これは特に意味はありません。 for (i = 1; i <= NF; i++)のほうがいいですね。 失礼しました。 >たとえば $var に >AAA BBB AAA CCC AAA >とかあったら、どんな出力が欲しいのでしょうか? BBBです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのです

    シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのですが、どうしたらいいでしょうか? 例えば、以下のようなtest.shというファイルを作ったとします。 --------------- #!/bin/sh AAA="x y" echo "" | awk '{print $AAA}' -------------- としたとき、$AAAが正常に出力できません。(なお、echo "" は、awkを走らせる為の単なるダミーです。) printの部分を ・awk '{print '$AAA'}' ・awk '{print "'$AAA'"}' などともしてみましたが、ダメでした。どのようにすればうまくいくでしょうか?

  • [awk]マッチしたものをすべて取り出したい

    awk(GNU awk)を使って正規表現にマッチした部分文字列を最初にマッチしたものだけでなく、すべて取り出したいと思っています。 grepコマンドを使うと次のように簡単に取得できるのですが、awkだけで実現する場合どのように記述したらよいのでしょうか? ■例 $ echo 'abcdebx' | grep -o 'b.' 結果: bc bx # 最初にマッチしたものだけなら取得できる $ echo 'abcdebx' | awk 'match($0, /b./) {print substr($0, RSTART, RLENGTH)}' 結果: bc ■環境 GNU Awk 4.0.1 よろしくお願いします。

  • 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"など文字列を出したいのですがどうすればいいでしょうか?

  • awk match関数

    awkのmatch関数で、 awk -F":" 'match($2, "/hogehoge/") {print $0} ファイル名 は、動きます。 たとえば、検索条件に"/"が入ってるときは、 awk -F":" 'match($2, "#hoge/hoge#") {print $0} ファイル名 ってやりたいんですが、動きません。 こういうもんなのですか?? awk -F":" 'match($2, "/hogehoge/i") {print $0} ファイル名 も、気持ち的に動いてほしいですが、これも、動きません。 こういうもんなのですか?? tolower($2) を使えば、それですみますが・・・ 質問が、2つになってしまいました。すみません。 よろしくお願いいたします。

  • UNIXで数字の文字列を、数値に変換するには?

    UNIXで、数字のみの文字列を、その文字列で表される数値に変換して変数に代入したいのですが、どうすればいいでしょうか? つまり、 VALUE=`echo 22j4444j33 | awk -F'j' '{print $1}'` <VALUEに入った"22"を22の数値に変換> exit $VALUE というようなことがしたいです。 よろしくお願いします。

  • 今、awkを使ったシェルスクリプトを作っています。

    今、awkを使ったシェルスクリプトを作っています。 aaa bbb ccc ddd ee ff gggg hhh といったファイルから、 bbb,ccc ff,gggg を取り出したいと思っています。 そこで、以下のコマンドをwhileでまわして、$iを増加させることにより、 ファイルを一行ずつ読み取り、目的の列を取り出したく思っています。 A=`cat sample.txt|awk 'NR == $i {print NR, $2;}'` B=`cat sample.txt|awk 'NR == $i {print NR, $3;}'` ところが、awkコマンドの中の$iがシングルクォーテーションでくくられているので、 変数展開されなくて困っています。 何かよい方法があればご教授いただけますでしょうか?

  • パターンマッチで変数でマッチさせるには?

    教えて下さい。 パターンマッチで変数$aaa(中身は2バイト文字)でマッチしたいのですが どう書いたらいいんでしょう? 以下のように書いたらマッチしませんでした(;ω;) if($value[5] =~ /^($aaa)/)

    • ベストアンサー
    • CGI
  • awk の使い方

    sample.txt ファイルには   "中村" "08/01/80" "03.1234.5678"   "木村" "08/01/81" "06.1252.2536" のような情報があります。 そこの3番フィールドが電話番号ですので、awkで検索しようと思っています。 それで、 awk -v ARGU="$NUM" ' { VAR=substr($3,2,(length($3)-2)) if ( ARGU == VAR ) {print} }' /sample.txt のようにして、検索をかけようとしましたが、できません。 どこが間違っているのか教えてください。 awkの他の方法があるとか、違うもの(sed or grep)でできるのであれば、お願いします。

  • 文字列から特定の文字を抜き出す

    こんにちは。 シェルスクリプトで文字列から特定の文字を抜き出し、 変数に入れたいのですが、うまくいきません。 申し訳ありませんが、アドバイスをお願いいたします。 文字列 $moji=aaa_bbb_ccc (文字は変動します) $a=aaa $b=bbb $c=ccc と"_"毎に変数に代入したい。 echo $moji | awk -F_ '{print $2}' で文字を標準出力に取り出すことはできるのですが、 そこから変数に代入する方法がいまいち分かりません。

  • awkのセパレータ指定について

    awkのセパレータ指定について教えてください。 以下のようなファイルがありそれを'||'区切りで出力したいです。 下記のような指定をしてみたのですが、 うまくいきませんでした。 cat text | awk -F '||' '{print $1}' [test.txt] aaa||bbb||ccc [期待する結果] print $1 → aaa print $2 → bbb print $3 → ccc どなたか教えてください。 よろしくお願いします。