- ベストアンサー
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とマッチしたら終了としたいのです どの用にしたらよいでしょうか? ご教授お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>>とかあったら、どんな出力が欲しいのでしょうか? >BBBです。 であるなら、今のスクリプトでできてませんか? 少なくともわたしが試したところではBBBが でてきましたけど。 補足の内容から判断すると、 >"AAA"という文字列を抜き出しているのですが じゃなくて、AAAを鍵にしてその次にくる フィールドを抜き出してますよね。 なら for ループは for (i=1; i<NF-1; i++) { でしょう。 <=NFだと、最終フィールドにAAAがあると 空文字列が出力されます。 それでいいというならまあいいですけど。 で、うまくいかないパターンがあるなら、それを提示してもらえませんか?
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
ちと疑問に思ったのですが、 > for (i = 0; i < NF; i++) { なぜフィールド0(レコード全体)から始めているのか。最終フィールドを除外しているのか。 > if ($i == "AAA") { > j = i+1; print $j ; exit; なぜ比較に使ったフィールドの次のフィールドを 出力しようとしているのか? がナニを目的としているのかがわかりません。 たとえば $var に AAA BBB AAA CCC AAA とかあったら、どんな出力が欲しいのでしょうか?
補足
> なぜフィールド0(レコード全体)から始めているのか。最終フィールドを除外しているのか。 これは特に意味はありません。 for (i = 1; i <= NF; i++)のほうがいいですね。 失礼しました。 >たとえば $var に >AAA BBB AAA CCC AAA >とかあったら、どんな出力が欲しいのでしょうか? BBBです。
お礼
確かに。 うまくいきますね・・・(^^; 抱えていた問題の原因は 別な部分にありました。 申し訳ありません。 ありがとうございます。