我想打印只有1个或更多单词的行。请帮忙。
while read line ; do
echo $line | wc -w
done t1.txt
发布于 2019-06-11 16:09:24
假设你将一个单词定义为由空格分隔的字符,那么awk可以很容易地做到这一点:
awk -v COUNT=$1 'NF>COUNT' t1.txt
它将第一个arg作为名为count的awk变量传递,并打印行,其中以空格分隔的字段数高于提供的计数。
如
$ 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
发布于 2019-06-11 17:21:13
使用while
结构时要记住两件事。
1.使用read -r
,而不是read
按字面意思保持输入。
2.将外部命令从body中取出(就像你现在一样)。如果要while
使用外部实用程序处理行,请尝试在while循环外部拉出外部实用程序。在while
循环中,它将被调用为每一行,在循环之外它将只被调用一次。您可以预期,您应该将预处理命令链放在while循环之前:
cmd1 | cmd2 | cmd3 | while read -r line; do
echo "This ${line} has been preprocessed."
done
该解决方案有一个很大的缺点。while循环在子进程中处理,对循环中设置的变量的任何更改都将丢失。
您可以通过“流程替换”来改进这一点:
while read -r line; do
echo "This ${line} has been preprocessed."
done < <(cmd1 | cmd2 | cmd3)
现在让我们关注一下cmd1 | cmd2 | cmd3
。你怎么${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循环。
https://stackoverflow.com/questions/-100006993
复制相似问题