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