में लाइन-एंडिंग को कैसे बदलें, मैं बड़ी फ़ाइल (> 100 एमबी) में सभी लाइन-एंडिंग को कैसे बदल सकता हूं? मैंवीआईएम
:%s/\n/, /g
करने की कोशिश की है, लेकिन यह बहुत धीमी है।
में लाइन-एंडिंग को कैसे बदलें, मैं बड़ी फ़ाइल (> 100 एमबी) में सभी लाइन-एंडिंग को कैसे बदल सकता हूं? मैंवीआईएम
:%s/\n/, /g
करने की कोशिश की है, लेकिन यह बहुत धीमी है।
तो, मैं माध्यम से चला गया और परीक्षण/उत्तर है कि अन्य लोगों द्वारा दिए गए थे में से कुछ समय समाप्त हो गया में एकीकृत, प्लस एक पाइथन जवाब खुद के। यहाँ मैं क्या मिला है:
टीआर:
> 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 के अलावा कुछ और भी देख सकते हैं एक अच्छा विचार है।
से पहले इसका परीक्षण करता हूं, मैं आपके अजीब परिणामों के बारे में बहुत संदिग्ध हूं। समय आप कुछ बार आदेश देते हैं, सिर्फ एक बार नहीं। पाइथन अजीब से तेज नहीं होना चाहिए, क्योंकि मॉड्यूल और सामान – ghostdog74
आयात करने में समय लगता है, यह लगभग कुछ बार चला गया, जो लगभग औसत था। बस इसे हर बार लगभग 10 बार, 1.7xx भाग गया। अगर मैं साइगविन अजीब का उपयोग नहीं कर रहा था तो शायद यह अलग होगा। –
@ ghostdog74 आप मेरे अजीब परिणामों पर संदेह करने का अधिकार रखते थे, मैंने इसे वास्तविक लिनक्स बॉक्स पर फिर से चलाया, और यह बहुत तेज था। –
अपनी फ़ाइल के माध्यम से जाने के लिए इस पर्ल स्क्रिप्ट का उपयोग करें; यह वीआईएम के साथ स्मृति में सब कुछ पकड़ने से तेज होगा। बस एक नई फाइल के लिए पाइप आउटपुट।
#!/usr/local/bin/perl
while (<>) {
$_ =~ s/\n/,/g;
print $_;
}
मुझे लगता है कि पर्ल दुभाषिया यह समझने के लिए पर्याप्त स्मार्ट नहीं है कि इस मामले में '$ _' के पास अंतिम चरित्र को छोड़कर एक नई लाइन नहीं हो सकती -' चॉम्प 'शायद बहुत तेज है। – Cascabel
@ जेफ्रोमी मेरे पूरी तरह से अवैज्ञानिक परीक्षण में, यह 100 मेगाहर्ट्ज फ़ाइल पर चॉम्प का उपयोग करने के लिए लगभग 300 मिमी तेज है। –
क्या आपको इसे विम में करना है?
अच्छी यूनिक्स उपयोगिता है जो चरित्र आधारित अनुवाद करता है। इसे tr
कहा जाता है। कुछ reference।
आपके मामले में यह होगा:
tr "\n" "," < input_file > output_file
यह मेरे द्वारा पोस्ट किए गए समाधानों की तुलना में लगभग निश्चित रूप से तेज़ है, लेकिन दुर्भाग्यवश, यह ओपी के अनुरोध के बजाय "," के बजाय "," को प्रतिस्थापित करता है। मुझे यकीन नहीं है कि 'tr' के साथ ऐसा करने का कोई तरीका है, है ना? – Cascabel
tr केवल एक वर्ण लेता है – ghostdog74
कोई नहीं है, मैंने वहां जगह नहीं देखी है। 1 से अधिक चरित्र डालने के लिए, कोई नीचे पोस्ट किए गए व्यक्ति के रूप में sed का उपयोग कर सकता है। – pajton
:%s/$/, /
एक :1,$j
के बाद तेजी से हो सकता है। अन्यथा, एक बाहरी उपयोगिता में यह कार्य करें:
perl -e 'while (<>) { chomp; print "$_, " }' input_file > output_file
awk '{printf("%s, ", $0)}' input_file > output_file
जो सबसे तेजी से होगा मेरे सिर के ऊपर से पता नहीं है।
'perl -ne 'chomp; प्रिंट करें "$ _," 'फाइल'। '-n'" लूप के दौरान मानता है " – ghostdog74
' -n' पर अच्छी कॉल। – Cascabel
@sparrkey, "perl तेजी से चलाएगा" उचित नहीं है। – ghostdog74
$ 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
क्या आपने अपने sed आदेश का परीक्षण किया था? sed 'एन; एस/\ n /, /' फ़ाइल – sparkkkey
वास्तव में नहीं। यह विकी का एक पेस्ट काटता है, लेकिन मुझे लगता है कि विकी कभी-कभी भरोसा नहीं किया जा सकता है। – ghostdog74
सबसे अच्छा टूल sed है और आप इसका उपयोग कर सकते हैं:! आदेश
तो :!sed -e 's/\n/,/g' % > %.tmp ; cat %.tmp > % ; rm %.tmp'
उपयोग करेंगे तो आपको परिवर्तन के साथ एक tmp फ़ाइल बनाने की जरूरत से पहले अपने वर्तमान फ़ाइल
क्या आपने अपने sed कमांड का परीक्षण किया था? – ghostdog74
हाँ मैं – shingara
आप इसे वीआईएम में क्यों करना चाहते हैं। आप बस एक लंबी लाइन के साथ समाप्त हो जाएंगे जिसे आप पढ़ नहीं सकते (आंखों के साथ।) इसके अलावा, कौन सी रेखा समाप्त होती है: डॉस, यूनिक्स, मैक या संयोजन? – Marichyasana