1

早上好。我有以下几行:

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 个“|”,这个实现仍然会打印错误。
有什么建议么 ?

PS - 我可以假设每行末尾都有一个 \n 。

4

4 回答 4

2

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

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

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

line="1 | blah | 2 | 1993 | 86 | 0 | NA | 123 | 123";
count=${line//[^|]/};
echo ${#count};
于 2013-06-01T08:05:28.793 回答
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将为您提供所需的输出。

于 2013-06-01T08:10:50.320 回答
1

grep

grep '^\([^|]*|[^|]*\)\{7\}$'
于 2013-06-01T08:14:35.337 回答
0

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

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

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

于 2013-06-01T08:11:16.157 回答