2013-06-26 41 views
8

我試圖從非常非常大的文件中刪除前37行。我開始嘗試sed和awk,但他們似乎需要將數據複製到新文件。我正在尋找一種「刪除線路」的方法,與sed -i不同,它不會複製任何類型的副本,而只是刪除現有文件中的行。在unix命令行中移除文件的前N行

這裏是我做了什麼......

awk 'NR > 37' file.xml > 'f2.xml' 
sed -i '1,37d' file.xml 

這兩個似乎做一個完整的副本。有沒有其他簡單的CLI可以在沒有完整文檔遍歷的情況下快速完成此操作?

+1

'sed -i'和'gawk v4.1 -i -inplace'選項基本上是在幕後創建臨時文件。 IMO'sed'應該比'tail'和'awk'快。 –

回答

10

有沒有簡單的方法使用UNIX工具完成就地編輯,但這裏有一個就地修改文件的解決方案,你也許可以修改爲你(羅伯特·博諾米的禮貌在https://groups.google.com/forum/#!topic/comp.unix.shell/5PRRZIP0v64)工作:

count=$(head -37 "$file" |wc -c) 
dd if="$file" bs="$count" skip=1 of="$file" 

最後的文件應該是$count字節比原來的小(因爲目標是從開始刪除$count字節),所以要完成我們必須刪除最後的$count字節。在GNU系統如Linux上,這可以通過以下方式完成:

truncate -s "-$count" "$file" 

請參閱我引用的其他建議和信息的google羣組。

+2

在linux上,你需要在'dd'中使用'conv = notrunc',否則命令失敗。 '+ 1'。 –

+0

我認爲這可能是因爲我的文件看起來不錯,但它似乎也做了額外的寫作,我終止了。因此,我寫了一個名爲cutter.sh的文件,其中包含'''!!/ bin/bash file = enwiki-latest-pages-articles.xml count ='head -37「$ file」| wc -c' dd if =「$ file」bs =「$ count」skip = 1 of =「$ file」conv = notrunc''' – Mittenchops

+0

它運行很長時間,然後當我重新開始時,結束於: '^ C1223734 + 0記錄在 1223734 + 0記錄輸出 2902697048字節(2.9 GB)複製,59.699 s,48.6 MB/s '但是,我的數據/相貌/罰款。我可以相信它的完整性嗎?似乎並不需要爲37條短線數據複製2.9GB。 – Mittenchops

4

是標準的編輯:

ed -s file <<< $'1,37d\nwq' 
+0

這是使用緩衝區,不比臨時文件更好。 –

+2

+1這很快。用1M文件的入口 - '$時間版-S FF <<< $ '1,37d \ nwq' 真正0m0.251s 用戶0m0.219s SYS 0m0.032s $時間SED -i「1,37d 'FF 真正0m1.415s 用戶0m0.399s SYS 0m1.016s'當然 –

+0

@EdMorton,這是編輯做什麼':)'的是,它可能會比[標籤:sed的]快或[標籤:AWK ] ... –

6

Unix文件語義不允許截斷文件的前部。

所有的解決方案將基於兩種:

  1. 文件讀入內存,然後寫回(edex,其他編輯器)。如果你的文件是< 1GB或者你有足夠的內存,這應該沒問題。
  2. 寫入第二拷貝和任選取代了原來的(sed -iawk/tail > foo)。只要您有足夠的可用磁盤空間作爲副本,這沒有關係,並且不介意等待。

如果文件太大而無法爲您工作,您可以根據讀取文件的內容來解決該問題。

也許你的讀者跳過註釋或空行?如果是這樣,那麼您可以製作一條讀者忽略的消息,確保它具有與文件中第37行相同的字節數,並用dd if=yourdata of=file conv=notrunc覆蓋文件的開頭。

+2

嗯,沒有想到這一點。如果我在bunzip2文件的時候這樣做 - 你說我會把解壓縮到awk,然後到outfile?那麼,那會是'bunzip2 filename.xml.bz2 |「 awk'NR> 37'filename.xml' – Mittenchops

+1

是的,這樣做時,解壓縮也只是流複製和只寫入修改文件磁盤。 – Peteris

2

副本將擁有在某個時候被創建 - 爲什麼不在閱讀的「修改」文件的時間;流更改副本而不是存儲它?

我在想什麼 - 創建命名管道「文件2」是相同的awk的「NR> 37」 file.xml或任何的輸出;那麼讀取file2的人將不會看到前37行。

的缺點是,它會運行文件處理awk每次,所以這是可行的只有當它很少看。