我有一个包含数百万条记录的gzip压缩文件tradedata.txt.gz
。此文件有大约50个以|
分隔的字段。第45个字段可以包含0000
,0002
,0003
,0004
和空值(null)等值。我想过滤文件并获取值为0000,0002且仅为空值的行。我希望使用awk
,perl
或任何其他语言以最快的方式执行此操作。
例如,数据看起来像这样(我只显示几个字段用于说明目的)。
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或任何其他语言以最快的方式帮助处理此请求吗?
答案 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