2010-03-04 100 views
8

如何替換大文件(> 100MB)中的所有換行符? 我試圖做如何替換VIM中的換行符

:%s/\n/, /g

但它的速度太慢。

+0

你爲什麼想在VIM中做到這一點。你只會得到一條你無法閱讀的長線(用眼睛看)。另外,還有什麼線結局存在:DOS,UNIX,MAC還是組合? – Marichyasana 2013-01-01 23:06:17

回答

8

所以,我經歷了和測試/定時一些被其他人給的答案之前整合,加上我自己的python答案。以下是我的了:

TR:

> time tr "\n" "," <lines> line 
real 0m1.617s 
user 0m0.100s 
sys  0m1.520s 

蟒蛇:

> time python -c 'import sys; print sys.stdin.read().replace("\n",", "),' <lines> line 
real 0m1.663s 
user 0m0.060s 
sys  0m1.610s 

AWK:

> time awk '{printf("%s, ", $0)}' lines > line         
real 0m1.998s 
user 0m0.390s 
sys  0m1.600s 

點的Perl:

> time perl -e 'while (<>) { chomp; print "$_, " }' lines > line 
real 0m2.100s 
user 0m0.590s 
sys  0m1.510s 

的sed:

> time sed 's/$/, /g' lines > line            
real 0m6.673s 
user 0m5.050s 
sys  0m1.630s 

這裏是我使用的文件:

> ls -lh lines 
-rw-r--r-- 1 some one 101M 2010-03-04 19:54 lines 
> wc -l < lines 
1300000 
> head -n 3 < lines 
The pretty pink puma pounced on the unsuspecting aardvark, the scientist watched. 
The pretty pink puma pounced on the unsuspecting aardvark, the scientist watched. 
The pretty pink puma pounced on the unsuspecting aardvark, the scientist watched. 
> head -n 1 < lines | wc -c 
82 

最初採取了Cygwin的時序,他們現在已經採取完全更新的Ubuntu 9.10。此外,文本文件的大小增加到100兆,線寬爲80個字符。正如你可以看到除sed以外的其他任何東西都是一個好主意。

+2

之前測試它,我非常懷疑你的awk結果。你幾次命令,而不只是一次。 Python不應該比awk快,考慮到導入模塊和東西需要時間 – ghostdog74 2010-03-05 00:56:35

+0

它運行了幾次,大概是平均值。只要再跑10次,每次1.7XX。如果我不使用cygwin awk,可能會有所不同。 – 2010-03-05 01:01:01

+0

@ ghostdog74 你對我的awk結果懷疑是正確的,我重新在真正的Linux機器上運行它,並且速度更快。 – 2010-03-05 02:46:27

2

使用此Perl腳本瀏覽您的文件;它將比使用VIM在內存中保存所有內容更快。只需將輸出輸出到新文件。

#!/usr/local/bin/perl 

while (<>) { 
    $_ =~ s/\n/,/g; 
    print $_; 
} 
+0

我猜測perl解釋器不夠聰明,知道在這種情況下'$ _'除了最後一個字符之外不能有換行符 - 'chomp'可能要快很多。 – Cascabel 2010-03-04 14:43:56

+0

@Jefromi 在我完全不科學的測試中,在100 meg文件上使用chomp速度約爲300ms。 – 2010-03-05 03:08:51

0

你必須在vim中做到這一點嗎?

有很好的Unix實用程序可以進行基於字符的翻譯。它叫做tr。 一些reference

你的情況,那就是:

 
tr "\n" "," < input_file > output_file 
+0

這幾乎肯定比我發佈的解決方案更快,但不幸的是,它會根據OP的要求替換「,」而不是「,」。我不確定有什麼方法可以用'tr'來做,是嗎? – Cascabel 2010-03-04 14:47:36

+0

tr只需要單個字符 – ghostdog74 2010-03-04 15:07:17

+0

不,沒有,我沒有注意到那裏的空間。要放置超過1個字符,可以使用sed作爲下面發佈的人。 – pajton 2010-03-04 15:31:37

3

:%s/$/, /後跟一個:1,$j可能會更快。否則,請在外部工具中執行此操作:

perl -e 'while (<>) { chomp; print "$_, " }' input_file > output_file 

awk '{printf("%s, ", $0)}' input_file > output_file 

不知道脫離我的頭,這將是最快的。

+0

'perl -ne'chomp;打印「$ _」,「文件」。 '-n'「假設while循環」 – ghostdog74 2010-03-04 15:08:17

+0

良好的調用'-n'。 – Cascabel 2010-03-04 15:20:45

+0

@sparrkey,「perl將運行得更快」是不合理的。 – ghostdog74 2010-03-05 01:20:48

0
$ more file 
aaaa 
bbbb 
cccc 
dddd 
eeee 

$ awk 'NR>1{printf("%s, ", p)}{p=$0}END{print p}' file 
aaaa, bbbb, cccc, dddd, eeee 

$ sed -e :b -e '$!N;s/\n/, /;tb' file 
+0

你測試過你的sed命令嗎? sed'N; s/\ n /,/'文件 – sparkkkey 2010-03-05 16:21:49

+0

不是。它削減了維基的粘貼,但我猜維基有時候不可信。 – ghostdog74 2010-03-05 23:58:07

0

最好的工具是sed,你可以使用它:!命令

所以使用:!sed -e 's/\n/,/g' % > %.tmp ; cat %.tmp > % ; rm %.tmp'

你需要創建一個變化的tmp文件在當前文件

+0

你測試了你的sed命令嗎? – ghostdog74 2010-03-05 01:05:34

+0

是的,我在 – shingara 2010-03-05 07:52:24