这是我的一个文本文件:
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