2013-06-01 23 views
1

早上好。 我有以下行:shell - grep - 如何获得只有一定数量的字符char

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。

回答

1

随着grep

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

真爱保佑你的*值*。 工作很好 –

+0

欢迎您:) – tarrsalah

2

,只包含7 |印刷生产线,尝试:

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

如果你想使用bash来计算在给定线的|数量,试试:

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

我不允许使用awk:\ same sed –

+0

@NadavPeled,为什么不呢? –

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 

above cut会给你你需要的输出。

0

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

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

会做的工作(虽然==和& &可能是=和&;我AWK是有点生疏)

+0

如果有7个分隔符,则有8个字段。你的语法是正确的 –

+0

确实glenn。我需要刷新我的awk技能...... – mark

+0

我说得太快了:'NF'是场的数量; '$ NF'是最后一个字段 –

相关问题