• ベストアンサー

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