管道如何处理linux中的多个文件?

时间:2016-12-02 08:00:49

标签: awk pipe

所以天真的我想用awk解析50个文件,所以我做了以下

zcat dir_with_50files/* > huge_file
cat huge_file | awk '{parsing}'

当然,这很糟糕,因为它会花时间创建一个文件,然后消耗一大堆内存传递给awk

然后一位同事告诉我,我可以这样做。

zcat dir_with_50files/filename{0..50} | awk '{parsing}'

令我惊讶的是,如果没有内存消耗,我会得到相同的结果。 ps aux还显示两个命令并行运行。我对发生的事情感到困惑,这个答案部分回答了我的问题。

https://stackoverflow.com/a/1072251/6719378

但是如果管道知道在一定数量的缓冲数据之后启动第二个命令,为什么我的天真方法比第二种方法消耗了更多的内存? 是因为我在单个文件上使用cat与加载多个文件相比?

1 个答案:

答案 0 :(得分:0)

您可以按文件

减少zcat文件的最大内存使用量

例如:

for f in dir_with_50files/* 
 do
    zcat f | awk '{parsing}' >> Result.File
 done

# or

find dir_with_50files/ -exec zcat {} | awk '{parsing}' >> Result.File \;

但它取决于您的解析

  • 如果与以前的项目没有关系,可以修改行,删除,复制(例如:sub( /foo/, "bar")
  • 不利于反击(例如:List[$2]++)或相关(修改)(例如:NR != FNR {...}; ! List[$2]++ {...}