2017-10-08 90 views
1

我在linux機器上有一個巨大的純文本文件(〜500Gb)。我想要在標題行(文件的第一行)中替換一些字符串,但是我所知道的所有方法似乎都很慢且效率較低。在linux命令行中用最大的文件替換字符串的最快方法?

例如文件:

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

預期文件輸出:

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

sed的

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命令,並讓我知道如果這可以幫助您,我無法測試它,因爲我沒有500 GB大文件。當然,它不應該在後端創建任何臨時文件,因爲它不會在Input_file上使用就地替換。

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

謝謝@ RavinderSingh13。這個命令可以處理這個問題,但速度沒有任何改進。正如托馬斯所說,除非我保持不變,否則可能沒有更好的辦法。 –

相關問題