AWK:フィールドの単語数に基づいて行を選択する方法は?

AWK:フィールドの単語数に基づいて行を選択する方法は?

これは私のテキストファイルの一つです。

1|this|1000
2|that|2000
3|hello|3000
4|hello world|4000
5|lucky you|5000
6|awk is awesome|6000
.
.
.

$ 2から2つの単語のみを含む行(4行目と5行目)のみを印刷するにはどうすればよいですか?

私が試したことは次のとおりです。ただし、単語数ではなく文字数を計算します。

awk -F"|" '{if(length($2==2) print $0}'

答え1

awk関数の戻り値を使用できますsplit

$ awk -F'|' 'split($2,a,"[ \t]+") == 2' file
4|hello world|4000
5|lucky you|5000

答え2

gsub代わりに関数の戻り値を使用することもできます。

awk -F'|' '{l=$0} gsub(/[ \t]+/,"",$2)==1{print l}'

答え3

awk '/^.+\|\w+ \w+\|/' input.txt

説明する:

  • '/^.+\|\w+ \w+\|/'- このパターンに一致するすべての行を印刷します。
  • ^- 行の先頭から始まります。
  • .+- 1つ以上のランダムな文字。
  • \|- パイプキャラクター。文字通り理解するにはバックスラッシュでエスケープする必要があり、そうでなければ「or」記号として扱われます。
  • \w+ \w+\- ランダムな単語文字、空白、ランダムな単語文字、つまり単語の空白の単語 - 正確に必要なものです。
  • \|- 2番目のパイプ文字です。

入力する

1|this|1000
2|that|2000
3|hello|3000
4|hello world|4000
5|lucky you|5000
6|awk is awesome|6000

出力

4|hello world|4000
5|lucky you|5000

関連情報