2013-02-22 18 views
11

मेरे पास लगभग 3 जीबी फ़ाइल है जो मैं शीर्ष पर दो पंक्तियां जोड़ना चाहता हूं। हर बार जब मैं इन लाइनों को मैन्युअल रूप से जोड़ने की कोशिश करता हूं, तो vim और vi सहेजने पर जमा हो जाते हैं (मैंने उन्हें प्रत्येक के बारे में 10 मिनट के लिए सहेजने की कोशिश की)। मैं उम्मीद कर रहा था कि शीर्ष पर जोड़ने के लिए एक तरीका होगा, वैसे ही आप फ़ाइल के निचले भाग में संलग्न होंगे। एकमात्र चीजें जो मैंने अभी तक देखी हैं, उनमें एक अस्थायी फ़ाइल शामिल है, जो फ़ाइल आकार के कारण मुझे धीमा लगेगा। मैं की तरह कुछ उम्मीद थी:एक बड़ी फ़ाइल के शीर्ष पर जोड़ें: bash

grep -top lineIwant >> fileIwant 

किसी फ़ाइल के शीर्ष पर संलग्न करने के लिए एक अच्छा तरीका पता है?

का उपयोग कर:

+0

पुन: "केवल एकमात्र चीजें जिन्हें मैंने देखा है, हालांकि एक अस्थायी फ़ाइल शामिल है, जो मुझे लगता है कि फ़ाइल आकार के कारण धीमा होगा": आपको पूरी फाइल में पढ़ने की आवश्यकता होगी , और अंदर सबकुछ लिखो कोई भी मामला, क्योंकि आप फ़ाइल में एक नई स्थिति में हर बाइट "चल रहे" हैं। तो आप वास्तव में एक अस्थायी फ़ाइल भी बना सकते हैं। – ruakh

+1

"शीर्ष पर संलग्न" आमतौर पर "प्रीपेडिंग" के रूप में जाना जाता है, और कुछ अन्य [इस विषय पर प्रश्न] हैं (http://stackoverflow.com/questions/2690823/prepending-to-a-multi-gigabyte- फ़ाइल) –

उत्तर

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

+1

ओपी को नोट करें: यह अभी भी एक अस्थायी फ़ाइल का उपयोग करता है, लेकिन यह कम से कम आपके विवरणों को छुपाता है। हालांकि, यह कोई तेज़ नहीं होगा। – chepner

2

इस तरह के एक Oper की गति की कोशिश करो आयन अंतर्निहित file system पर निर्भर करता है। मेरे ज्ञान के लिए इस विशेष ऑपरेशन के लिए एक एफएस अनुकूलित नहीं है। अधिकांश एफएस पूर्ण डिस्क ब्लॉक का उपयोग कर फाइलों को व्यवस्थित करता है, जिसे अंतिम के अलावा छोड़ दिया जाता है, जिसे आंशिक रूप से फ़ाइल के अंत तक उपयोग किया जा सकता है। दरअसल, आकार N की एक फ़ाइल, N/S ब्लॉक, जहां S ब्लॉक आकार है, और (आकार N%S, % के शेष ऑपरेटर जा रहा है) फ़ाइल के शेष भाग के लिए एक और ब्लॉक ले NS से विभाज्य नहीं है जाएगा।

आमतौर पर, इन ब्लॉकों को डिस्क (या विभाजन) पर उनके सूचकांक द्वारा संदर्भित किया जाता है, और इन इंडेक्स को एफएस मेटाडाटा के भीतर संग्रहीत किया जाता है, जो फाइल एंट्री से जुड़ा होता है जो उन्हें आवंटित करता है।

इस विवरण से, आप देख सकते हैं कि फ़ाइल द्वारा उपयोग किए गए ब्लॉक की नई सूची के साथ मेटाडेटा को अपडेट करके, सामग्री का आकार कितना संभव हो सकता है, जिसका आकार ब्लॉक आकार का एक बहु होगा। हालांकि, अगर वह प्रीपेड सामग्री बिल्कुल ब्लॉक नहीं भरती है, तो मौजूदा डेटा को उस अधिक राशि से स्थानांतरित करना होगा।

कुछ एफएस फ़ाइलों के लिए आंशिक रूप से उपयोग किए गए ब्लॉक (और न केवल अंतिम प्रविष्टि के रूप में) फ़ाइलों के लिए उपयोग की संभावना को लागू कर सकते हैं, लेकिन यह करने के लिए एक छोटी सी बात नहीं है।

अधिक जानकारी के लिए इन अन्य अतः प्रश्न देखें: एक उच्च स्तर पर

, भले ही वह आपरेशन एफएस चालक के द्वारा समर्थित है, यह अभी भी संभव है वह कार्यक्रम सुविधा का उपयोग नहीं करते हैं।

उस समस्या के उदाहरण के लिए आप हल करने का प्रयास कर रहे हैं, तो सबसे अच्छा तरीका शायद cat में नई सामग्री और मौजूदा एक को नई फाइल में सक्षम करने वाला प्रोग्राम है।

+0

मुझे लगता है कि मेरा जवाब आपकी समस्या के लिए अधिक उपयोग नहीं है, लेकिन यह लक्षणों के पीछे कारण समझने में मदद कर सकता है। – didierc

6

मैं का उपयोग कर की तुलना करने के कुछ बेंच मार्किंग किया बिल्ली (सुझाव here के रूप में) के साथ यथा-स्थान संपादित करें (सुझाव here के रूप में) sed।

~ 3GB bigfile डॉट्स से भरा:

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

$ du -b bigfile 
3025635308  bigfile 

फ़ाइल नई-पंक्तियों दो पंक्तियों के साथ bigfile के शीर्ष पर डालने के लिए:

$ cat newlines 
some data 
some other data 

$ du -b newlines 
26  newlines 

बेंचमार्क परिणाम dumbbench v0.08 का उपयोग कर :

बिल्ली:

$ 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%) 

तो से

$ 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 डी बड़े फाइलों पर इन-प्लेस संपादन करते समय धीमा (80.6%) लगता है, शायद बाद में मूल फ़ाइल के स्थान पर मध्यस्थ अस्थायी फ़ाइल को स्थानांतरित करने के कारण। I/O पुनर्निर्देशन का उपयोग sedबिल्ली से केवल 11.8% धीमी है।

इन परिणामों के आधार पर मैं बिल्ली का उपयोग this answer में सुझाए गए अनुसार करता हूं।

0
cat file 

    Unix 
    linux 

यह आदेश

एसईडी मैं '1 ए सी \ N जावा' फ़ाइल

cat file 
    Unix 
    C 
    java 
    Linux 

का उपयोग कर आप सम्मिलित करना चाहते दो एक ही समय में फ़ाइल की तर्ज को संलग्न का मतलब है I और Replace का उपयोग करने का मतलब है c

संबंधित मुद्दे