代码之家  ›  专栏  ›  技术社区  ›  posdef

使用AWK过滤大型分隔文件

  •  0
  • posdef  · 技术社区  · 7 年前

    我目前的策略是在任何处理之前使用GNU排序。在这一点上,我还可以过滤我不需要的字段,因此我有以下一行代码:

    awk '{ print $37,$62,$23,$10,$53,$57,$68,$26,$52,$4,$38,$5,$24 }' ../ck_data/big.txt | gsort --parallel=8 --key=1,1 -n -o ../ck_data/sorted.txt
    

    这里的问题是,添加过滤步骤会显著降低速度。在我的机器上排序整个文件(没有任何awk)需要不到2分钟,而这两个过程都需要16分钟20秒。

    1 回复  |  直到 7 年前
        1
  •  2
  •   JonDeg    4 年前

    我开源了一个用于制表符分隔文件的工具,该工具提高了过滤步骤的awk速度。该工具是 tsv-select tsv utilities toolkit . 不同awk实现的性能比较如下 here . 与awk调用等效的是

    $ tsv-select -f 37,62,23,10,53,57,68,26,52,4,38,5,24 ../ck_data/big.txt
    

    您可以尝试的另一种方法是考虑awk的替代版本。在我的测试中,我发现mawk在这个任务上比其他版本的awk要快得多。请参阅上面列出的基准页面。(注意:Mac OS X附带的awk版本非常慢。gawk(gnu awk)要快得多。可以通过macports或自制软件获得。)