首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >仅打印超过1字的行

仅打印超过1字的行
EN

Stack Overflow用户
提问于 2019-06-11 08:07:47
回答 2查看 0关注 0票数 0

我想打印只有1个或更多单词的行。请帮忙。

代码语言:javascript
复制
while read line ; do
    echo $line | wc -w 
done t1.txt
EN

回答 2

Stack Overflow用户

发布于 2019-06-11 16:09:24

假设你将一个单词定义为由空格分隔的字符,那么awk可以很容易地做到这一点:

代码语言:javascript
复制
awk -v COUNT=$1 'NF>COUNT' t1.txt

它将第一个arg作为名为count的awk变量传递,并打印行,其中以空格分隔的字段数高于提供的计数。

代码语言:javascript
复制
$ 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
票数 0
EN

Stack Overflow用户

发布于 2019-06-11 17:21:13

使用while结构时要记住两件事。 1.使用read -r,而不是read按字面意思保持输入。

2.将外部命令从body中取出(就像你现在一样)。如果要while使用外部实用程序处理行,请尝试在while循环外部拉出外部实用程序。在while循环中,它将被调用为每一行,在循环之外它将只被调用一次。您可以预期,您应该将预处理命令链放在while循环之前:

代码语言:javascript
复制
cmd1 | cmd2 | cmd3 | while read -r line; do
   echo "This ${line} has been preprocessed."
done

该解决方案有一个很大的缺点。while循环在子进程中处理,对循环中设置的变量的任何更改都将丢失。

您可以通过“流程替换”来改进这一点:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档