我只想打印含有1美元或更多单词的行。请帮忙。
while read line ; do
echo $line | wc -w
done t1.txt
答案 0 :(得分:5)
假设你将一个单词定义为由空格分隔的字符,那么awk会很容易地做到这一点:
awk -v COUNT=$1 'NF>COUNT' t1.txt
它将第一个arg作为名为count的awk变量传递,并打印行,其中以空格分隔的字段数高于提供的计数。
e.g。
$ echo $COUNT
3
$ cat t1.txt
hey
hey hey hey hey hey
hey hey hey
hey hey hey
hey hey hey hey hey
hey hey hey hey hey
hey hey hey
$ awk -v COUNT=$COUNT 'NF>COUNT' t1.txt
hey hey hey hey hey
hey hey hey hey hey
hey hey hey hey hey
答案 1 :(得分:0)
您可以通过将输入行读入数组然后将数组lentgh与$1
进行比较来实现:
while read -r; do
read -ra arr <<< "$REPLY"
[[ ${#arr[@]} -ge $1 ]] && echo "$REPLY"
done < t1.txt
答案 2 :(得分:0)
使用while
构造时要记住两件事
1.使用read -r
而不是read
来保持输入的字面意思。
2.将外部命令从身体中取出(就像你现在一样)。
如果要使用while
和外部实用程序处理行,请尝试在while循环外部拉出外部实用程序。在while
循环中,将为每一行调用它,在循环外它将只调用一次。
您可能希望,您应该将预处理命令链放在while循环之前:
cmd1 | cmd2 | cmd3 | while read -r line; do
echo "This ${line} has been preprocessed."
done
这种解决方案有一个很大的缺点。 while循环在子进程中处理,对循环中设置的变量的任何更改都将丢失。
您可以通过&#34;流程替换&#34;:
来改善这一点while read -r line; do
echo "This ${line} has been preprocessed."
done < <(cmd1 | cmd2 | cmd3)
现在让我们关注cmd1 | cmd2 | cmd3
。你如何从每一行获得前3个${n}
个单词?您需要根据想要查看单词的方式调整命令。 word<space><space>word
是一行有2个单词还是一行有空的第二个单词和第三个单词?
使用不同的选项来解析t1.txt:
awk # syntax not included here
grep ".* .* .*" # Difficult to use $n
grep -E "^(\w+ *){3,}" t1.txt
grep -E "^(\w+ *){$n,}" t1.txt
sed -n '/.* .* .*/p' t1.txt
这些命令的输出可以重定向到while循环,但是对于基本要求,可以跳过while循环。