shell - grep - 如何只获取具有一定数量char的行

时间:2013-06-01 07:56:51

标签: shell grep

早上好。 我有以下几行:

1 | blah | 2 | 1993 | 86 | 0 | NA | 123 | 123
1 | blah | TheBeatles | 0 | 3058 | NA | NA | 11

我想只获得7 "|"和第一个字段相同的行。

所以这两行的输出都没有,但对于这两行:

1 | blah | 2 | 1993 | 86 | 0 | NA | 123 
1 | blah | TheBeatles | 0 | 3058 | NA | NA | 11

输出将是“错误”。
我使用以下命令从文件中获取输入:

grep '.*|.*|.*|.*|.*|.*|.*|.*' < $1 | sort -nbsk1 | cut -d "|" -f1 | uniq -d |
while read line2; do
  echo error
done

但即使我有超过7“|”,这个实现仍然会打印错误。
有什么建议 ?

P.S - 我可以假设每行末尾有一个\ n。

4 个答案:

答案 0 :(得分:2)

对于仅包含7 |的打印行,请尝试:

awk -F'|' 'NF == 8' filename

如果您想使用bash计算给定行中|的数量,请尝试:

line="1 | blah | 2 | 1993 | 86 | 0 | NA | 123 | 123";
count=${line//[^|]/};
echo ${#count};

答案 1 :(得分:1)

假设zz.txt是:

$ cat zz.txt

1 | blah | 2 | 1993 | 86 | 0 | NA | 123 | 123
1 | blah | TheBeatles | 0 | 3058 | NA | NA | 11

$ cut  -d\| -f1-8 zz.txt

以上cut将为您提供所需的输出。

答案 2 :(得分:1)

使用grep

grep '^\([^|]*|[^|]*\)\{7\}$'

答案 3 :(得分:0)

我建议您使用awk来完成这项工作。

BEGIN { FS = "|" }
NF == 8 && $1 == '1' { print $0}

会完成这项工作(虽然==和&amp;&amp;可能是=和&amp ;;我的awk有点生锈)