2013-04-22 3 views
6

मुझे पता है कि अजीब और sed का उपयोग करके लाइनों की एक श्रृंखला कैसे प्राप्त करें। मैं यह भी जानता हूं कि awk और sed का उपयोग करके प्रत्येक एनएचटी लाइन को कैसे प्रिंट किया जाए।awk, sed, या अन्य यूनिक्स कमांड का उपयोग करके मैं प्रत्येक एनएच अंतराल रेखा को कैसे प्राप्त कर सकता हूं?

हालांकि, मुझे नहीं पता कि दोनों को कैसे जोड़ा जाए।

उदाहरण के लिए, मेरे पास 1780000 लाइनों वाली एक फ़ाइल है।

प्रत्येक 17800 वीं लाइन के लिए, मैं इसके बाद 17800 वें लाइन और दो प्रिंट करना चाहता हूं।

तो अगर मैं 1,780,000 लाइनों के साथ एक फ़ाइल है और यह 1 से शुरू होता है और 1,780,000 पर समाप्त होता है, इस प्रिंट होगा:

1 
2 
3 
17800 
17801 
17802 
35600 
35601 
35602 
# ... and so on. 

किसी को भी पता है कि कैसे हर वें अंतराल awk का उपयोग कर लाइन की एक सीमा प्राप्त करने के लिए, sed, या अन्य यूनिक्स कमांड?

उत्तर

4

जीएनयू का उपयोग sed:

sed -n '0~17800{N;N;p}' input 

अर्थ,

For every 17800th line: 0~17800 
    Read two lines: {N;N; 
    And print these out: p} 

हम यह भी पहली तीन पंक्तियों में जोड़ सकते हैं:

sed -n -e '1,3p' -e '0~17800{N;N;p}' input 

Awk का उपयोग करना, यह आसान हो जाएगा:

awk 'NR%17800<3 || NR==3 {print}' input 
+0

बहुत बहुत धन्यवाद। तो अगर मैं एनएच लाइन के बाद 100 लाइनों को प्रिंट करना चाहता हूं, तो मुझे 100 एन की आवश्यकता है; या क्या कोई आसान तरीका है? –

+0

हां आपको 100 एन की जरूरत है, उस मामले में अजीब स्पष्ट रूप से जाने का तरीका है। – perreal

+0

लेकिन आप sed script – perreal

2
$ cat file 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

$ awk '!(NR%3)' file 
3 
6 
9 

$ awk -v intvl=3 -v delta=2 '!(NR%intvl){print "-----"; c=delta} c&&c--' file 
----- 
3 
4 
----- 
6 
7 
----- 
9 
10 

$ awk -v intvl=4 -v delta=2 '!(NR%intvl){print "-----"; c=delta} c&&c--' file 
----- 
4 
5 
----- 
8 
9 

$ awk -v intvl=4 -v delta=3 '!(NR%intvl){print "-----"; c=delta} c&&c--' file 
----- 
4 
5 
6 
----- 
8 
9 
10 
संबंधित मुद्दे