2012-03-27 12 views
22

एक पाठ फ़ाइल में 9 10 लाइनों के बाहर हर वैज्ञानिक डेटा के साथ फ़ाइल, उदा .:मैं टेक्स्ट फ़ाइल में प्रत्येक Xth लाइन को कैसे हटा सकता हूं?

5.787037037037037063e-02 2.048402977658663748e-01 
1.157407407407407413e-01 4.021264347118673754e-01 
1.736111111111111049e-01 5.782032163406526371e-01 

मैं आसानी से कैसे हटा सकते हैं, उदाहरण के लिए, हर दूसरी पंक्ति, या विचार करें? उदाहरण के लिए यह एक बैश स्क्रिप्ट के साथ संभव है?

पृष्ठभूमि: फ़ाइल बहुत बड़ी है लेकिन मुझे साजिश के लिए बहुत कम डेटा चाहिए। ध्यान दें कि मैं उबंटू/लिनक्स का उपयोग कर रहा हूं।

+0

क्या आप वाकई इस तरह पाइंट डेटा-नमूने के लिए चाहते हैं? डाउनसमैप्लिंग करना बेहतर हो सकता है, जहां एन लाइनों के समूह से डेटा कुछ उचित तरीके से औसत होता है। प्वाइंट नमूना संभावित रूप से एलियासिंग मुद्दों की ओर जाता है। – Kaz

+0

http: //unix.stackexchange।कॉम/प्रश्न/168004/हटाएं-हर-एनएच-लाइन-इन-शैल –

उत्तर

53

यह awk साथ पूरा करने के लिए आसान है।

निकालें हर दूसरे पंक्ति:

awk 'NR % 2 == 0' file > newfile 

हर 10 वीं लाइन निकालें:

awk 'NR % 10 != 0' file > newfile 

awk में एनआर चर लाइन संख्या है। {} के बाहर कुछ भी अजीब है, और डिफ़ॉल्ट कार्रवाई प्रिंट करना है।

+0

कभी नहीं सुना पहले अजीब निश्चित रूप से अब इसे जांच लेंगे! धन्यवाद! – Ingo

+0

शैल स्क्रिप्ट में टेक्स्ट प्रोसेसिंग के लिए Awk बहुत अच्छा है। यह फ्लोटिंग पॉइंट गणित भी कर सकता है, जो बाश नहीं कर सकता है। शैल कोडर के लिए सीखने के लिए निश्चित रूप से समय के लायक है। – jordanm

+1

पहला कमांड लाइनों को यहां तक ​​कि आईडी के साथ छोड़ देता है, यह इसे हटा नहीं देता है। यदि आप इसे हटाना चाहते हैं, तो 'एनआर% 2! = 0' फ़ाइल> newfile का उपयोग करें। – Olga

2

कोशिश कुछ की तरह:

awk 'NR%3==0{print $0}' file 

यह तीन में से एक लाइन प्रिंट होगा। या:

awk 'NR%10<9{print $0}' file 

दस में से 9 लाइनों को प्रिंट करेगा।

+1

प्रिंट डिफ़ॉल्ट कार्रवाई है, इसलिए 'प्रिंट $ 0' की आवश्यकता नहीं है। – jordanm

+0

मुझे पता है। हालांकि मुझे बहुत अजीब लग रहा है। (मैं एक अनुभवी अजीब उपयोगकर्ता नहीं हूं।) – Mat

+0

एनआर% 10 9 से अधिक कभी नहीं हो सकता ... – 123

2

आप इसे संभवतः sed के साथ कर सकते हैं, उदा।

sed -n -e 'p;N;d;' file # print every other line, starting with line 1 

यदि आपके पास जीएनयू sed यह बहुत आसान

sed -n -e '0~10p' file # print every 10th line 
sed -n -e '1~2p' file # print every other line starting with line 1 
sed -n -e '0~2p' file # print every other line starting with line 2 
0

आप एक अजीब और एक खोल स्क्रिप्ट का उपयोग कर सकते हैं। Awk मुश्किल हो सकता है लेकिन ...

इस विशिष्ट लाइनों को नष्ट करेगा आप के लिए यह बताना:

nawk -f awkfile.awk [filename] 

awkfile.awk contents 

BEGIN { 
if (!lines) lines="3 4 7 8" 
n=split(lines, lA, FS) 
for(i=1;i<=n;i++) 
linesA[lA[i]] 
} 
!(FNR in linesA) 

इसके अलावा, मैं याद नहीं कर सकते, तो विम मानक Ubuntu या नहीं के साथ आता है। अगर यह नहीं मिलता है।

फिर vim vim [filename] के साथ फ़ाइल को खोलने

तो हर दूसरी लाइन को नष्ट करेगा

:%!awk NR\%2 or :%!awk NR\%2 

यह टाइप करें। एक अलग आवृत्ति के लिए बस 2 को दूसरे पूर्णांक में बदलें।

6

perl के बारे में कैसे?

perl -n -e '$.%10==0&&print'  # print every 10th line 
+0

के रूप में फिर से लिखा जा सकता है, वह हर 10 वीं पंक्ति को रखने के बजाय हर 10 वीं पंक्ति को हटाना चाहता है। आपके कोड में आसान परिवर्तन, = = == के बजाय। – jordanm

+2

नहीं। "वह कहता है," मैं आसानी से ** ** कैसे हटा सकता हूं, उदाहरण के लिए, हर दूसरी पंक्ति, या ** फाइल में 10 में से 9 ** लाइनों में से 9? ", 10 में से प्रत्येक 9 लाइनों को हटाने का मतलब है हर प्रिंटिंग 10 वीं। जैसा कि आप कहते हैं, समाधान पोस्ट होने के बाद इसे अनुकूलित करना आसान होता है, इसलिए मैंने अन्य पोस्टर को सही करने के लिए परेशान नहीं किया है, जिन्होंने एक ही त्रुटि की है। – Sorpigal

+0

फिर से प्रश्न को फिर से पढ़ने के बाद, मेरा मानना ​​है कि आपकी व्याख्या सही है। – jordanm

2

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

seq 10 | sed '0~2d' # delete every 2nd line 
1 
3 
5 
7 
9 
seq 100 | sed '0~10!d' # delete 9 out of 10 lines 
10 
20 
30 
40 
50 
60 
70 
80 
90 
100 
संबंधित मुद्दे