किसी बड़े टेक्स्ट फ़ाइल की पहली n लाइन्स निकालें


63

मुझे 2GB SQL डंप की पहली 42 लाइनों को हटाने की आवश्यकता है।

मुझे पता है कि मैं पहली पंक्तियों का उपयोग करके देख सकता हूं:

head -n 44 dump.sql

लेकिन क्या उन्हें संपादित करने या हटाने के लिए कुछ भी है?

जवाबों:


91

यदि आप सिर्फ 43 वीं पंक्ति से उन लाइनों को देखना चाहते हैं जो आप उपयोग कर सकते हैं

tail -n +43 dump.sql

+संकेत महत्वपूर्ण है - बिना यह, tailप्रिंट होगा पिछले 43 लाइनों के बजाय। वैकल्पिक रूप से 'sed' के साथ

sed 1,42d dump.sql

यदि आप मूल फ़ाइल से वास्तव में पहले 42 लाइनों को हटाना चाहते हैं तो आप sed को -iविकल्प के साथ परिवर्तन कर सकते हैं

sed -i 1,42d dump.sql

बहुत बढ़िया जवाब, का शानदार उपयोग tail। मुझे आपके उत्तरों से सीखने के लिए कई बार कुछ नया मिला। धन्यवाद।
स्मारिका

1
ओह मैन टेल-एन +43 गेम चेंजर है! मैं एक ही प्रभाव के लिए sed की एक अजीब आह्वान का उपयोग कर रहा हूँ।
pfctdayelise

4
यदि आपके पास डिवाइस पर कोई स्थान नहीं बचा है तो क्या होगा? sed -i 1,50000000d 17GigFileएक अस्थायी फ़ाइल बनाता है sedXYZजो कई और गीगाबाइट का उपभोग करता है। क्या अस्थायी फ़ाइलों के बिना एक दृष्टिकोण है?
जून्यूम्फ

प्रश्न में उल्लिखित tail -n +43और क्या अंतर है head -n 44?
हाशिम

@juanmf आप एक गुई उपकरण के साथ ऐसा करने की कोशिश कर सकते हैं (मैंने माउसपैड का उपयोग करके किया है, लेकिन ब्याज की फ़ाइल "केवल" ~ 700 एमबी है। फ़ाइल को लोड करने के लिए कुछ समय लगता है, हालाँकि ...
Digger

18

यह सबसे आसान लगता है:

sed '1,42d' test.sql > test2.sql

Test.sql से लाइनें 1-42 निकालें और test2.sql के रूप में सहेजें


9
यदि आपको मूल फ़ाइल रखने की आवश्यकता नहीं है, तो एक छोटी सी sed -i '1,42d' test.sql होगी।
सादी


3

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -s -c '1d42|x' dump.sql
  1. 1 पहली पंक्ति में जाएं

  2. 42 42 लाइनों का चयन करें

  3. d हटाना

  4. x सहेजें और बंद करें


1
क्या यह एक अस्थायी फ़ाइल बनाता है? क्या ऐसा करना संभव है जब डिवाइस पर छोड़ा गया स्थान फ़ाइल आकार से कम हो?
जुआनफ

2
@juanmf इन सभी समाधानों के लिए एक अस्थायी फ़ाइल की आवश्यकता होती है। केवल अस्थायी फ़ाइल का उपयोग किए बिना फ़ाइल के अंत से डेटा निकालना संभव है ।
पर्ल

0

क्षमा करें, मैं अभी आपको वास्तविक कोड नहीं दे सकता। हालाँकि, की तर्ज पर कुछ देखने की कोशिश करें

tail -n arcv(`wc -l`) -44

यह क्या करना चाहिए (एक बार ठीक से प्रारूपित) फ़ाइल में पंक्तियों की संख्या (wc -l) की गणना करें, इसमें से 44 घटाएं (-44) और फिर फ़ाइल में 45 वीं पंक्ति से शुरू होने वाली सभी चीज़ों का प्रिंट आउट लें।

उम्मीद है इससे मदद मिलेगी और सौभाग्यशाली हो।


यह काफी इष्टतम नहीं है बुला wc -lफ़ाइल पर, आप इसे दो बार की प्रक्रिया है, जबकि sedया tailयह केवल एक बार की प्रक्रिया।
यो '

0

इसे इस्तेमाल करे,

head -n 42 dump.sql > tmp; cat dump.sql | grep -vxf tmp > dump.sql.new; rm tmp

या,

a=$(cat dump.sql| wc -l); tail -n "$((a-42))" dump.sql > dump.sql.new

0

बस इसे जोड़ना है। यदि आप एक मैक पर हैं तो आपको बैकअप एक्सटेंशन को जोड़ना होगा। इस पोस्ट से उत्तर दें ।

sed -i '.bak' 1,42d dump.sql

0

sedलिनक्स और मैक में विसंगतियों के कारण , मैंने tail -n +43 dump.sql > dump.sqlप्रारूप का उपयोग करने का संकल्प लिया ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.