perl - 如何快速解析大(> 10GB)文件?

标签 perl awk large-files

我必须处理格式为 10-20GB 的文本文件:
字段 1 字段 2 字段 3 字段 4 字段 5

我想将 field2 每一行的数据解析成几个文件之一;被插入的文件由 field4 中的值逐行确定。 field2 中有 25 个不同的可能值,因此数据可以解析为 25 个不同的文件。

我尝试过使用 Perl(慢)和 awk(更快但仍然很慢) - 有没有人对替代方法有任何建议或指示?

仅供引用,这是我尝试使用的 awk 代码;请注意,我不得不恢复处理大文件 25 次,因为我无法在 awk 中同时打开 25 个文件:

chromosomes=(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25)
for chr in ${chromosomes[@]}
do

awk < my_in_file_here -v pat="$chr" '{if ($4 == pat) for (i = $2; i <= $2+52; i++) print i}' >> my_out_file_"$chr".query 

done

最佳答案

使用 Perl,在初始化期间打开文件,然后将每一行的输出与适当的文件匹配:

#! /usr/bin/perl

use warnings;
use strict;

my @values = (1..25);

my %fh;
foreach my $chr (@values) {
  my $path = "my_out_file_$chr.query";
  open my $fh, ">", $path
    or die "$0: open $path: $!";

  $fh{$chr} = $fh;
}

while (<>) {
  chomp;
  my($a,$b,$c,$d,$e) = split " ", $_, 5;

  print { $fh{$d} } "$_\n"
    for $b .. $b+52;
}

关于perl - 如何快速解析大(> 10GB)文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1919026/

相关文章:

linux - 我怎么知道我在 perl 脚本中运行的是 64 位还是 32 位 linux?

没有反转/反转的字典顺序字符串排列

perl - = 和 , Perl 中的运算符

linux - 如何使用 linux 命令删除大文件 (>5G) 的某些行

arrays - awk 问题(从用户定义的函数返回一个数组)

perl - 在perl中遍历哈希数组

linux - 如何从复杂的文件中获取字段

Android Large PNG 不显示问题

python - 如何读取大型 csv 文件的特定行

python - NumPy 读取文件并即时过滤行