Command-Line

合併大量文件

  • November 10, 2021

我有 ±10,000 個文件 ( res.1- res.10000),全部由一列和相等的行數組成。我想要的本質上是簡單的;將所有文件按列合併到一個新文件final.res中。我試過使用:

paste res.*

但是(儘管這似乎適用於一小部分結果文件,但在整個集合上執行時會出現以下錯誤:Too many open files.

必須有一種“簡單”的方法來完成這項工作,但不幸的是,我對 unix 還是很陌生。提前致謝!

PS:為了讓您了解(我的一個)數據文件的樣子:

0.5
0.5
0.03825
0.5
10211.0457
10227.8469
-5102.5228
0.0742
3.0944
...

如果您對該機器具有 root 權限,您可以暫時增加“打開文件描述符的最大數量”限制:

ulimit -Hn 10240 # The hard limit
ulimit -Sn 10240 # The soft limit

進而

paste res.* >final.res

之後,您可以將其設置回原始值。


第二種解決方案,如果您無法更改限制:

for f in res.*; do cat final.res | paste - $f >temp; cp temp final.res; done; rm temp

它對每個文件呼叫paste一次,最後有一個包含所有列的巨大文件(需要一分鐘)。

編輯無用的使用 cat不是

正如評論中提到的,cathere ( cat final.res | paste - $f >temp) 的使用並非沒有用處。循環第一次執行時,該文件final.res尚不存在。paste然後會失敗,文件永遠不會被填充,也不會被創建。我的解決方案只cat在第一次失敗時No such file or directorypaste標準輸入讀取一個空文件,但它繼續。錯誤可以忽略。

引用自:https://unix.stackexchange.com/questions/205642