2013-02-22 51 views
11

我有一個近3 GB的文件,我想添加兩行到頂部。每次我嘗試手動添加這些行時,vim和vi都會凍結保存(我讓他們嘗試每次保存大約10分鐘)。我希望有一種方法可以追加到頂端,就像你將追加到文件的底部一樣。但是目前爲止我看到的唯一的東西包括一個臨時文件,由於文件大小,我覺得它會很慢。 我希望是這樣的:追加到一個大文件的頂部:bash

grep -top lineIwant >> fileIwant 

有誰知道附加到文件的頂部的好辦法?

+0

回覆:「到目前爲止,我所看到的唯一的東西包括一個臨時文件,我覺得文件大小會很慢」:您需要讀入整個文件,並把所有的東西寫出來無論如何,因爲您正在將每個字節「移動」到文件中的新位置。所以你真的不妨創建一個臨時文件。 – ruakh 2013-02-22 20:37:19

+1

「附加到頂部」通常被稱爲「預先考慮」,還有一些其他問題[http://stackoverflow.com/questions/2690823/prepending-to-a-multi-gigabyte-文件) – 2013-02-22 20:53:49

回答

10

嘗試

cat file_with_new_lines file > newfile 
2

試着這樣做:

使用

sed -i '1i NewLine' file 

或者使用:

ed -s file <<EOF 
1i 
NewLine 
. 
w 
q 
EOF 
+0

這是解決問題的正確方法。添加-i編輯文件。 'sed -i'1i newline'/ path/to/file' – Ken 2013-02-22 20:40:17

+1

對OP的說明:這仍然使用臨時文件,但它至少隱藏了您的詳細信息。不過,它不會更快。 – chepner 2013-02-22 21:15:56

2

這樣的OPER的速度這在很大程度上取決於底層file system。據我所知,沒有針對這一特定操作進行優化的FS。大多數FS使用完整的磁盤塊來組織文件,除了最後一個,可能會在文件末尾部分使用。實際上,尺寸N的文件將採取N/S塊,其中S是塊的大小,和用於(大小N%S%的作爲餘運算符)的文件的剩餘部分多一個塊中,如果N是不是由S整除。

通常,這些塊通過它們在磁盤(或分區)上的索引來引用,並且這些索引存儲在FS元數據中,附加到分配它們的文件條目。

從這個描述中,你可以看到,只需用文件使用的新塊列表更新元數據,就可以將大小設置爲塊大小倍數的內容預先加入。但是,如果前置內容不能完全填充一定數量的塊,則現有數據必須按照超出的數量進行移位。

一些FS可能會實現在列表中部分使用塊的可能性(而不僅僅是作爲最後一項)用於文件,但這不是一件微不足道的事情。

看到這些其他等問題,爲進一步的細節:

在一個較高的水平,即使操作由FS驅動程序支持,它仍然有可能該程序不使用該功能。

對於您試圖解決的那個問題的實例,最好的方法可能是一個程序,能夠將新內容和現有的內容添加到新文件中。

+0

我想我的答案對您的問題沒有多大用處,但它可能有助於理解症狀背後的原因。 – didierc 2013-02-22 21:14:08

6

我做了一些基準測試使用比較的sed與就地編輯(如建議here)至(如建議here)。

〜3GB 大文件充滿點:

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

$ du -b bigfile 
3025635308  bigfile 

文件換行符有兩條線中插入對頂部大文件

$ cat newlines 
some data 
some other data 

$ du -b newlines 
26  newlines 

使用dumbbench 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%) 

所以SE在對大文件進行就地編輯時,d似乎比較慢(80.6%),可能是由於之後將中間臨時文件移動到原始文件的位置。使用I/O重定向sed僅比cat慢11.8%。

基於這些結果,我將使用this answer建議。

0
cat file 

    Unix 
    linux 

它使用命令

的sed -i'1Aç\ n Java的文件

cat file 
    Unix 
    C 
    java 
    Linux 

要插入追加到在同一時間的文件的兩行意思是使用我和替換意味着使用c