热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

Ihaveagzippedfiletradedata.txt.gzwhichcontainsmillionsofrecords.thisfilehasabout50fi

I have a gzipped file tradedata.txt.gz which contains millions of records. this file has about 50 fields separated by |. The 45th field can contain values such as 0000, 0002, 0003, 0004 and blank value(null). I want to filter the file and get those rows with value 0000,0002 and blank values only. I want to do this in the fastest way using awk, perl, or any other language.

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

For example, the data looks like this (I am only displaying few fields for illustration purposes).

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

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

The results after filtering the data should be:

过滤数据后的结果应为:

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

As you can see, I am only pulling records with value 0000,0002 and blank. Can someone help with this request using awk, perl or anything other language that does it the fastest way?

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

2 个解决方案

#1


Using 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

Change $4 to $45 for your actual input file.

将实际输入文件的$ 4更改为$ 45。

Using 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

Change $F[3] to $F[44] for your actual input file.

将实际输入文件的$ F [3]更改为$ F [44]。

Update:

As hobbs mentioned in the comment below, you can try the following if existing solution aren't quick enough:

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

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

perl -F'\ |' -lane'打印如果$ F [3] =〜/ \ A(?:0002 | 0000 |)\ z /'文件

#2


Here is all in one test

这是一次测试

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

推荐阅读
author-avatar
技术潜行者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有