过滤数百万条记录的平面文件中的数据

时间:2015-05-13 03:05:43

标签: perl awk filtering

我有一个包含数百万条记录的gzip压缩文件tradedata.txt.gz。此文件有大约50个以|分隔的字段。第45个字段可以包含0000000200030004和空值(null)等值。我想过滤文件并获取值为0000,0002且仅为空值的行。我希望使用awkperl或任何其他语言以最快的方式执行此操作。

例如,数据看起来像这样(我只显示几个字段用于说明目的)。

abc|234|test|0000|test2|1
abc|2343|test1|0002|test2|1
abc|2345|test3|0004|test2|1
abc|2346|test4|0004|test2|1
abc|2347|test5|0003|test2|1
abc|2348|test6||test2|1
abc|234|test|0003|test2|1

过滤数据后的结果应为:

abc|234|test|0000|test2|1
abc|2343|test1|0002|test2|1
abc|2348|test6||test2|1

正如您所看到的,我只会提取值为0000,0002且空白的记录。 有人可以使用awk,perl或任何其他语言以最快的方式帮助处理此请求吗?

2 个答案:

答案 0 :(得分:2)

使用awk

$ awk -F'|' '$4=="0000"||$4=="0002"||$4==""' file
abc|234|test|0000|test2|1
abc|2343|test1|0002|test2|1
abc|2348|test6||test2|1

$4更改为$45以获取实际输入文件。

使用perl

$ perl -F'\|' -lane 'print if grep $F[3] eq $_, ("0002", "0000", "")' file
abc|234|test|0000|test2|1
abc|2343|test1|0002|test2|1
abc|2348|test6||test2|1

$F[3]更改为$F[44]以获取实际输入文件。

<强>更新

如下面评论中提到的hobbs,如果现有解决方案不够快,您可以尝试以下方法:

perl -F'\|' -lane 'print if $F[3] =~ /\A(?:0002|0000|)\z/' file

答案 1 :(得分:1)

以下是一次测试

awk -F'|' '$4~/^(000(0|2)|)$/' file
abc|234|test|0000|test2|1
abc|2343|test1|0002|test2|1
abc|2348|test6||test2|1
相关问题