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
標準入力から空のファイルを読み込みますが、続きます。このエラーは無視できます。