如何grep对于csv文件中的特定数字

时间:2018-02-20 07:10:56

标签: linux perl

我有这个csv文件

4,1,0,1,1,1,0,0,0
5,1,0,1,2,1,0,0,0
6,1,0,1,3,1,0,0,0
7,1,0,1,4,1,0,0,0
8,1,0,2,3,2,0,0,0
9,1,0,2,4,2,0,0,0
10,1,0,2,5,2,0,0,0
11,1,0,2,6,2,0,0,0
12,1,1,3,3,3,0,0,1
13,1,1,3,4,3,0,0,1
14,1,1,3,5,3,0,0,1
15,1,1,3,6,3,0,0,1
16,1,1,3,7,3,0,0,1
17,1,1,4,6,4,0,0,1
18,1,1,4,7,4,0,0,1
19,1,1,4,8,4,0,0,1
20,1,1,5,7,5,0,0,1

我想要从8开头的grep 我正在尝试

grep 8 example.csv

然后我得到了foll o / p

8,1,0,2,3,2,0,0,0
18,1,1,4,7,4,0,0,1
19,1,1,4,8,4,0,0,1

我只想要以8开头的行。我应该怎么做?

2 个答案:

答案 0 :(得分:4)

grep ^8, example.txt

其中^表示匹配模式必须从行的开头开始。我还添加了","到正则表达式,所以它不会匹配以80开头的行

答案 1 :(得分:4)

由于您使用perl对此进行了标记,因此我假设您正在寻找Perl解决方案。最简单但最不稳健的是:

$ perl -ne 'print if /^8,/' example.csv
8,1,0,2,3,2,0,0,0

这与@Dienow的grep解决方案相同。也可以使用-F command-line option来分隔逗号上的行 - 但请注意,这不会处理引用字段,转义分隔符等的情况。

$ perl -F, -nle 'print if $F[0]==8' example.csv
8,1,0,2,3,2,0,0,0

如果您正在使用CSV文件,我建议您使用Text::CSV(同时安装Text::CSV_XS以获得速度)。

use warnings;
use strict;
use Text::CSV;

my $csv = Text::CSV->new({ binary=>1, auto_diag=>2, eol=>$/ });
while ( my $row = $csv->getline(*ARGV) ) {
    $csv->print(select, $row) if $row->[0] == 8;
}
$csv->eof or $csv->error_diag;

然后像这样运行:

$ perl csv.pl example.csv
8,1,0,2,3,2,0,0,0

唯一需要注意的是它可能会重新格式化输入行(但它当然仍然是正确的CSV)。