2010-03-04 10 views
8

में लाइन-एंडिंग को कैसे बदलें, मैं बड़ी फ़ाइल (> 100 एमबी) में सभी लाइन-एंडिंग को कैसे बदल सकता हूं? मैंवीआईएम

:%s/\n/, /g

करने की कोशिश की है, लेकिन यह बहुत धीमी है।

+0

आप इसे वीआईएम में क्यों करना चाहते हैं। आप बस एक लंबी लाइन के साथ समाप्त हो जाएंगे जिसे आप पढ़ नहीं सकते (आंखों के साथ।) इसके अलावा, कौन सी रेखा समाप्त होती है: डॉस, यूनिक्स, मैक या संयोजन? – Marichyasana

उत्तर

8

तो, मैं माध्यम से चला गया और परीक्षण/उत्तर है कि अन्य लोगों द्वारा दिए गए थे में से कुछ समय समाप्त हो गया में एकीकृत, प्लस एक पाइथन जवाब खुद के। यहाँ मैं क्या मिला है:

टीआर:

> 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 

पर्ल:

> 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 मेगाहर्ट्ज तक बढ़ा दिया गया था, जिसमें 80ish वर्ण चौड़े थे। जैसा कि आप sed के अलावा कुछ और भी देख सकते हैं एक अच्छा विचार है।

+2

से पहले इसका परीक्षण करता हूं, मैं आपके अजीब परिणामों के बारे में बहुत संदिग्ध हूं। समय आप कुछ बार आदेश देते हैं, सिर्फ एक बार नहीं। पाइथन अजीब से तेज नहीं होना चाहिए, क्योंकि मॉड्यूल और सामान – ghostdog74

+0

आयात करने में समय लगता है, यह लगभग कुछ बार चला गया, जो लगभग औसत था। बस इसे हर बार लगभग 10 बार, 1.7xx भाग गया। अगर मैं साइगविन अजीब का उपयोग नहीं कर रहा था तो शायद यह अलग होगा। –

+0

@ ghostdog74 आप मेरे अजीब परिणामों पर संदेह करने का अधिकार रखते थे, मैंने इसे वास्तविक लिनक्स बॉक्स पर फिर से चलाया, और यह बहुत तेज था। –

2

अपनी फ़ाइल के माध्यम से जाने के लिए इस पर्ल स्क्रिप्ट का उपयोग करें; यह वीआईएम के साथ स्मृति में सब कुछ पकड़ने से तेज होगा। बस एक नई फाइल के लिए पाइप आउटपुट।

#!/usr/local/bin/perl 

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

मुझे लगता है कि पर्ल दुभाषिया यह समझने के लिए पर्याप्त स्मार्ट नहीं है कि इस मामले में '$ _' के पास अंतिम चरित्र को छोड़कर एक नई लाइन नहीं हो सकती -' चॉम्प 'शायद बहुत तेज है। – Cascabel

+0

@ जेफ्रोमी मेरे पूरी तरह से अवैज्ञानिक परीक्षण में, यह 100 मेगाहर्ट्ज फ़ाइल पर चॉम्प का उपयोग करने के लिए लगभग 300 मिमी तेज है। –

0

क्या आपको इसे विम में करना है?

अच्छी यूनिक्स उपयोगिता है जो चरित्र आधारित अनुवाद करता है। इसे tr कहा जाता है। कुछ reference

आपके मामले में यह होगा:

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

यह मेरे द्वारा पोस्ट किए गए समाधानों की तुलना में लगभग निश्चित रूप से तेज़ है, लेकिन दुर्भाग्यवश, यह ओपी के अनुरोध के बजाय "," के बजाय "," को प्रतिस्थापित करता है। मुझे यकीन नहीं है कि 'tr' के साथ ऐसा करने का कोई तरीका है, है ना? – Cascabel

+0

tr केवल एक वर्ण लेता है – ghostdog74

+0

कोई नहीं है, मैंने वहां जगह नहीं देखी है। 1 से अधिक चरित्र डालने के लिए, कोई नीचे पोस्ट किए गए व्यक्ति के रूप में sed का उपयोग कर सकता है। – pajton

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'" लूप के दौरान मानता है " – ghostdog74

+0

' -n' पर अच्छी कॉल। – Cascabel

+0

@sparrkey, "perl तेजी से चलाएगा" उचित नहीं है। – ghostdog74

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 /, /' फ़ाइल – sparkkkey

+0

वास्तव में नहीं। यह विकी का एक पेस्ट काटता है, लेकिन मुझे लगता है कि विकी कभी-कभी भरोसा नहीं किया जा सकता है। – ghostdog74

0

सबसे अच्छा टूल sed है और आप इसका उपयोग कर सकते हैं:! आदेश

तो :!sed -e 's/\n/,/g' % > %.tmp ; cat %.tmp > % ; rm %.tmp'

उपयोग करेंगे तो आपको परिवर्तन के साथ एक tmp फ़ाइल बनाने की जरूरत से पहले अपने वर्तमान फ़ाइल

+0

क्या आपने अपने sed कमांड का परीक्षण किया था? – ghostdog74

+0

हाँ मैं – shingara