多数のファイルをマージ

多数のファイルをマージ

res.1±10,000個のファイル( - )があり、res.10000すべて1つの列と同じ数の行で構成されています。私が望むのは本質的に簡単です。すべてのファイルを列単位で新しいファイルにマージしますfinal.res。私は以下を試してみました。

paste res.*

しかし、(これは結果ファイルの小さなサブセットに対して機能するようですが、コレクション全体で実行すると、次のエラーが発生しますToo many open files

これを達成するための「簡単な」方法が必要です。しかし残念ながら、私はUnixに初めて接する人です。よろしくお願いします!

PS:(私)データファイルの1つがどのように見えるかについてのアイデアを提供するには:

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

ベストアンサー1

マシンへのルートアクセス権がある場合は、開いているファイルディスクリプタの最大数の制限を一時的に増やすことができます。

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

それから

paste res.* >final.res

後で元の値にリセットできます。


2番目の解決策、制限を変更できない場合:

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

ファイルごとに1回呼び出され、pasteすべての列を含む巨大なファイルが生成されます(1分かかります)。

編集する:猫に役に立たない用途...いいえ

コメントで述べたように、catここで()を使用することはcat final.res | paste - $f >temp役に立ちません。ループを初めて実行すると、ファイルはfinal.resまだ存在しません。pasteその後、失敗し、ファイルがいっぱいにならず、生成されません。私の解決策はcat初めてのみ失敗No such file or directoryし、paste標準入力から空のファイルを読み込みますが、続きます。このエラーは無視できます。

おすすめ記事