2016-12-02 90 views
1

因此,一個天真的我想解析使用awk 50個文件,所以我做了以下管道系統如何處理Linux中的多個文件?

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

不確定我理解這個問題。你創建了一個文件。一個文件使用內存。這是答案嗎?順便說一下,請參閱https://www.google.com/search?q=uuoc&ie=utf-8&oe=utf-8然後考慮'awk'腳本'文件'而不是'cat file | awk'script''。 –

+1

你如何測量內存使用量?你確定你的內存使用不僅僅是[磁盤緩存](http://www.linuxatemyram.com/)? (嘗試'free -m') – e0k

+0

@EdMorton他正在使用['zcat'](https://linux.die.net/man/1/zcat),它在'cat'之前解壓gzip文件。我不認爲'awk'可以解壓輸入文件。 – e0k

回答

0

您可以通過文件

前減少ZCAT文件maximuml內存使用:

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 \; 

,但它取決於你的解析

  • 確定爲modfying線,刪除,複製如果與以前的項目沒有關係(例如:sub(/foo/, "bar")
  • 不好(例如:List[$2]++)或相關(修改)(例如:NR != FNR {...}; ! List[$2]++ {...}