2017-10-08 14 views
1

私はLinuxマシン上で巨大なプレーンテキストファイル(〜500Gb)を持っています。私は、ヘッダー行(ファイルの最初の行)のいくつかの文字列を置き換えるが、私が知っているすべてのメソッドが遅く、効率が低いようだ。Linuxのコマンドラインで巨大なファイルの最初の行の文字列を置換する最速の方法は?

例ファイル:

foo apple cat 
1 2 2 
2 3 4 
3 4 6 
... 

予想ファイル出力:をsedの

bar apple cat 
1 2 2 
2 3 4 
3 4 6 
... 

sed -i '1s/foo/bar/g' file 
-i

缶Cファイルを置き換えますが、このコマンドはディスク上にtmpファイルを生成し、tmpファイルを使用して元のファイルを置き換えます。 ioの無駄な時間。


vimの

ex -c '1s/foo/bar/g' -c 'wq' file 

Vimはtmpファイルを生成しませんが、このツールは、メモリへの全体ファイルをロードする、のいずれかに多くの時間を無駄にしています。


最初の行だけをメモリに読み込んで元のファイルに書き戻すより良い解決策がありますか?私はLinuxのheadコマンドが最初の列を非常に高速に抽出できることを知っていました。

+0

質問入力にサンプル入力と希望する出力を追加してください。 – Cyrus

+2

これは、 'foo'と' bar'が同じ長さ(バイト単位)である場合にのみ行うことができます。それ以外の場合は、ファイル全体を書き換えることが唯一の選択肢です(ただし、ツールが十分スマートな場合はインプレースで実行できます)。 – Thomas

+0

@cyrus例を追加しました。 –

答えて

0

awkコマンドに従ってみてください。私が500GBのような巨大なサイズのファイルを持っていないので、これをテストすることはできませんでした。これは、Input_fileの置き換えを使用していないので、バックエンドに一時ファイルを作成してはいけません。

awk 'FNR==1{$1="bar";print;next} 1' Input_file > temp_file && mv temp_file Input_file 
+0

ありがとう@ RavinderSingh13。このコマンドはこの問題に対処できますが、速度の改善はありません。私がスティングの長さを変えない限り、トーマスが示唆したように、そうするのが良い方法はないかもしれません。 –

関連する問題