14

3 GB近くのファイルがあり、その上に2行追加したいと思います。これらの行を手動で追加しようとするたびに、vimとviは保存時にフリーズします(それぞれ約10分間保存しようとします)。ファイルの下部に追加するのと同じように、上部に追加する方法があることを期待していました。ただし、これまでに見たのは一時ファイルだけで、ファイルサイズが原因で遅くなると思います。私は次のようなことを望んでいました:

grep -top lineIwant >> fileIwant

ファイルの先頭に追加する良い方法を知っている人はいますか?

4

5 に答える 5

16

試す

cat file_with_new_lines file > newfile
于 2013-02-22T20:36:10.893 に答える
7

sedをインプレース編集 (ここで提案) とcat (ここで提案) を使用して比較するために、いくつかのベンチマークを行いました。

ドットで満たされた最大 3 GB のビッグファイル:

$ head -n3 bigfile
................................................................................
................................................................................
................................................................................

$ du -b bigfile
3025635308      bigfile

bigfileの上に挿入する 2 行のファイル改行:

$ cat newlines
some data
some other data

$ du -b newlines
26      newlines

Dambench v0.08を使用したベンチマーク結果:

:

$ dumbbench -- sh -c "cat newlines bigfile > bigfile.new"
cmd: Ran 21 iterations (0 outliers).
cmd: Rounded run time per iteration: 2.2107e+01 +/- 5.9e-02 (0.3%)

リダイレクト付きのsed :

$ dumbbench -- sh -c "sed '1i some data\nsome other data' bigfile > bigfile.new"
cmd: Ran 23 iterations (3 outliers).
cmd: Rounded run time per iteration: 2.4714e+01 +/- 5.3e-02 (0.2%)

インプレース編集でsed :

$ dumbbench -- sh -c "sed -i '1i some data\nsome other data' bigfile"
cmd: Ran 27 iterations (7 outliers).
cmd: Rounded run time per iteration: 4.464e+01 +/- 1.9e-01 (0.4%)

そのため、おそらく中間の一時ファイルを後で元のファイルの場所に移動するため、大きなファイルでインプレース編集を行うと、sedはかなり遅くなるようです (80.6%)。I/O リダイレクションsedを使用すると、 catよりもわずか 11.8% 遅くなります。

これらの結果に基づいて、この回答で提案されているようにcatを使用します。

于 2013-02-23T01:15:01.580 に答える
2

これをやってみてください:

を使用:

sed -i '1i NewLine' file

またはを使用:

ed -s file <<EOF
1i
NewLine
.
w
q
EOF
于 2013-02-22T20:35:28.840 に答える
2

このような操作の速度は、基盤となるファイル システムに大きく依存します。私の知る限り、この特定の操作に最適化された FS はありません。ほとんどの FS は、ファイルの最後で部分的に使用される可能性がある最後のブロックを除いて、完全なディスク ブロックを使用してファイルを編成します。実際、 のサイズのファイルはブロック (はブロック サイズ)Nを取り、 が で割り切れない場合は、ファイルの残りの部分 (サイズ、剰余演算子)用にもう 1 つのブロックを使用します。N/SSN%S%NS

通常、これらのブロックはディスク (またはパーティション) 上のインデックスによって参照され、これらのインデックスは FS メタデータ内に格納され、ブロックを割り当てるファイル エントリに添付されます。

この説明から、ファイルで使用されるブロックの新しいリストでメタデータを更新するだけで、サイズがブロック サイズの倍数になるコンテンツを先頭に追加できることがわかります。ただし、先頭に追加されたコンテンツが正確にブロック数を満たさない場合は、既存のデータを超過分だけシフトする必要があります。

一部の FS は、ファイルの使用済みブロックのリスト内に (最後のエントリとしてだけでなく) 部分的に使用されたブロックを持つ可能性を実装する場合がありますが、これは簡単なことではありません。

詳細については、これらの他の SO の質問を参照してください。

より高いレベルでは、その操作が FS ドライバーによってサポートされていても、プログラムがその機能を使用しない可能性があります。

あなたが解決しようとしているその問題の例では、おそらく最善の方法はcat、新しいコンテンツと既存のコンテンツを新しいファイルに変換できるプログラムです。

于 2013-02-22T21:10:18.840 に答える
0
  cat file

   Unix
   linux   

コマンドを使用して、ファイルの2行に同時に追加します

sed -i '1a C \n java ' ファイル

 cat file
   Unix
   C
   java
   Linux

INSERT は i を使用することを意味し、Replace は c を使用することを意味します

于 2013-02-23T11:15:04.670 に答える