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 中包含两个且仅有两个单词的行(第 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+\|/'- 将打印符合此模式的所有行。
  • ^- 从该行的开头开始。
  • .+- 一个或多个任意字符。
  • \|- 管道字符。应该用反斜杠转义以便从字面上理解,否则它被处理为“或”符号。
  • \w+ \w+\- 任何单词字符,然后是空格,然后是任何单词字符,或者换句话说:单词空格单词 - 正是您所需要的。
  • \|- 第二个管道符。

输入

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

相关内容