仅打印超过$ 1字的行

时间:2016-03-02 19:43:30

标签: linux bash wc

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

while read line ; do
    echo $line | wc -w 
done t1.txt

3 个答案:

答案 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循环。

相关问题