unix - यूनिक्स पर टेक्स्ट फ़ाइल से लाइनों की पूर्व निर्धारित सीमा को मैं कैसे निकाल सकता हूं?




command-line sed (14)

मेरे पास ~ 23000 लाइन एसक्यूएल डंप है जिसमें डेटा के कई डेटाबेस हैं। मुझे इस फ़ाइल के एक निश्चित खंड को निकालने की आवश्यकता है (यानी एक डेटाबेस के लिए डेटा) और इसे एक नई फाइल में रखें। मैं चाहता हूं कि डेटा की शुरुआत और अंत पंक्ति संख्या दोनों को मैं जानता हूं।

क्या कोई लाइन यूनिट कमांड (या कमांड की श्रृंखला) को लाइन 16224 और 16482 के बीच फ़ाइल से सभी लाइनों को निकालने के लिए जानता है और फिर उन्हें एक नई फ़ाइल में रीडायरेक्ट करता है?


आप 'vi' और फिर निम्न आदेश का उपयोग कर सकते हैं:

:16224,16482w!/tmp/some-file

वैकल्पिक रूप से:

cat file | head -n 16482 | tail -n 258

संपादित करें: - स्पष्टीकरण जोड़ने के लिए, आप पहले 16482 लाइनों को प्रदर्शित करने के लिए हेड -6 16482 का उपयोग करते हैं, फिर पहले आउटपुट से पिछली 258 लाइनों को पाने के लिए पूंछ-258 का उपयोग करें।


चूंकि हम एक टेक्स्ट फ़ाइल से पाठ की रेखाओं को निकालने के बारे में बात कर रहे हैं, इसलिए मैं एक विशेष मामला दूंगा जहां आप एक निश्चित पैटर्न से मेल खाने वाली सभी लाइनों को निकालना चाहते हैं।

myfile content:
=====================
line1 not needed
line2 also discarded
[Data]
first data line
second data line
=====================
sed -n '/Data/,$p' myfile

[डेटा] लाइन और शेष मुद्रित करेंगे। यदि आप लाइन 1 से पैटर्न को टेक्स्ट चाहते हैं, तो आप टाइप करें: sed -n '1, / data / p' myfile। इसके अलावा, यदि आप दो पैटर्न (अपने पाठ में बेहतर अद्वितीय) जानते हैं, तो सीमा की शुरुआत और अंत पंक्ति दोनों को मैचों के साथ निर्दिष्ट किया जा सकता है।

sed -n '/BEGIN_MARK/,/END_MARK/p' myfile

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

sed -n -e '/DROP TABLE IF EXISTS.*`person `/,/UNLOCK TABLES/p' data.sql  > new_data.sql

इस उत्तर के आधार पर, जहां आप तालिका को पुनर्स्थापित कर रहे हैं, उसके लिए "ड्रॉप तालिका अगर EXIST" गुम है, तो आपको अगली तालिका को हटाने से रोकने के लिए इसे उपयोग करने से पहले नई फ़ाइल के नीचे से कुछ पंक्तियां हटाना होगा।

यहां विस्तृत जानकारी भी मिल सकती here


मै इस्तेमाल करूंगा:

awk 'FNR >= 16224 && FNR <= 16482' my_file > extracted.txt

एफएनआर में फाइल से पढ़ने वाली लाइन की रिकॉर्ड (लाइन) संख्या होती है।


मैं सिर / पूंछ चाल पोस्ट करने वाला था, लेकिन वास्तव में मैं शायद emacs आग लगाना होगा। ;-)

  1. एएससी - एक्स गोटो-लाइन रेट 16224
  2. निशान ( ctrl - space )
  3. एएससी - एक्स गोटो-लाइन रेट 16482
  4. एएससी - डब्ल्यू

नई आउटपुट फ़ाइल खोलें, सीटीएल-वाई सेव करें

चलो देखते हैं कि क्या हो रहा है।


मैंने splitter नामक एक हास्केल प्रोग्राम लिखा जो वास्तव में ऐसा करता है: मेरे रिलीज ब्लॉग पोस्ट के माध्यम से पढ़ा है

आप इस प्रकार प्रोग्राम का उपयोग कर सकते हैं:

$ cat somefile | splitter 16224-16482

और यह सब कुछ है कि इसके लिए है। इसे स्थापित करने के लिए आपको Haskell की आवश्यकता होगी। बस:

$ cabal install splitter

और तुम कर रहे हो मुझे आशा है कि आपको यह प्रोग्राम उपयोगी लगेगा।


यह आपके लिए काम कर सकता है (जीएनयू sed):

sed -ne '16224,16482w newfile' -e '16482q' file

या बैश का लाभ लेना:

sed -n $'16224,16482w newfile\n16482q' file

यहां तक ​​कि हम कमांड लाइन पर जांचने के लिए भी ऐसा कर सकते हैं:

cat filename|sed 'n1,n2!d' > abc.txt

उदाहरण के लिए:

cat foo.pl|sed '100,200!d' > abc.txt

सिर / पूंछ का उपयोग कर काफी सरल:

head -16482 in.sql | tail -258 > out.sql

sed का उपयोग कर:

sed -n '16482,16482p' in.sql > out.sql

awk का उपयोग कर:

awk 'NR>=10&&NR<=20' in.sql > out.sql

स्वीकार में जवाब काम करते हैं। यदि आप इच्छुक हैं तो यहां एक और तरीका है।

cat $filename | sed "${linenum}p;d";

यह निम्नलिखित करता है:

  1. एक फ़ाइल की सामग्री में पाइप (या पाठ में फ़ीड हालांकि आप चाहते हैं)।
  2. sed दिए गए लाइन का चयन करता है, इसे प्रिंट करता है
  3. डी को लाइनों को हटाने की आवश्यकता है, अन्यथा sed मान लेंगे कि सभी लाइनें अंततः मुद्रित की जाएंगी। यानि, डी के बिना, आपको दो बार मुद्रित चयनित लाइन द्वारा मुद्रित सभी लाइनें मिलेंगी क्योंकि आपके पास $ {linenum} p भाग है जिसे प्रिंट करने के लिए कहा जा रहा है। मुझे पूरा यकीन है कि -एन मूल रूप से वही काम कर रहा है जैसा डी यहाँ है।

sed -n '16224,16482p' < dump.sql


 # print section of file based on line numbers
 sed -n '16224 ,16482p'               # method 1
 sed '16224,16482!d'                 # method 2

perl -ne 'print if 16224..16482' file.txt > new_file.txt

sed -n '16224,16482 p' orig-data-file > new-file

जहां 16224,16482 प्रारंभ रेखा संख्या और अंत पंक्ति संख्या, समावेशी हैं। यह 1 अनुक्रमित है। -इनपुट को आउटपुट के रूप में इनपुट को प्रतिबिंबित करता है, जिसे आप स्पष्ट रूप से नहीं चाहते हैं; संख्याएं निम्नलिखित कमांड को संचालित करने के लिए लाइनों की सीमा इंगित करती हैं; कमांड p प्रासंगिक लाइनों को प्रिंट करता है।







text-processing