1

私は数千のファイルを持っていますが、それぞれに非常に長い行が1つしか含まれていません。

IDフィールドで1行に1つのエントリを分割して、すべてを1つのファイルに変換したいのですが、これはいくつかのファイルで機能しますが、数百のファイルでは時間がかかりすぎ、数千のファイルではクラッシュするようです。無制限のより速い方法を探しています。

(find -type f -name '*.xml' -exec cat {} \;) | awk '{gsub("ID","\nID");printf"%s",$0}' 

私もこれを試しました。

(find -type f -name '*.xml' -exec cat {} \;) | sed 's/ID/\nID/g' 

問題は、挿入の代わりに置換を使用しようとしていること、またはメモリを使いすぎていることだと思います。

ありがとう

4

2 に答える 2

2

cat何千ものファイルでテストすることはできませんが、で処理する前にすべてのデータをメモリに保存する代わりに、次のように、一度にいくつかのファイルでawk実行してみてください。awk

find . -type f -name "*.xml*" -exec awk '{gsub("ID","\nID");printf"%s",$0}' {} +
于 2013-03-04T21:49:50.977 に答える
1
  1. 処理する必要のあるすべてのファイルのリストを作成します
  2. このリストを、それぞれ50個のファイルを含む小さなリストに分割します
  3. サブリストを読み取り、中間ファイルを出力するスクリプトを作成し、IDも実行します
  4. バックグラウンドプロセスと同じ数の、一度に3、20プロセスでスクリプトを実行する別のスクリプトを作成します
  5. 出力ファイルをマージします
于 2013-03-04T21:47:36.560 に答える