प्रत्येक 50 लाइनों में से 15 और 25 लाइनों को कैसे प्रिंट करें?


9

मेरे पास एक बड़ी फाइल है और मैं प्रत्येक अनुक्रमिक 50 लाइनों, 15 वीं और 25 वीं लाइनों से प्रिंट लेना चाहूंगा ।

sed -n '15,25p' inputfile

केवल 15 और 25 लाइनों को प्रिंट करने के लिए और फ़ाइल में प्रत्येक 50 लाइनों पर लूप करने के लिए इस कमांड को कैसे संशोधित करें।

जवाबों:


22
awk 'NR % 50 == 15 || NR % 50 == 25'

स्पष्ट पोर्टेबल तरीका होगा।

एक GNU sedविकल्प पर ध्यान दें :

sed '15~50b;25~50b;d'

किसी के साथ sed, आप हमेशा कर सकते हैं:

sed -n 'n;n;n;n;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n'

(अगली पंक्ति 14 बार प्राप्त करें, प्रिंट करें, अगली पंक्ति 10 बार, प्रिंट करें, अगली पंक्ति 25 बार, अगले चक्र पर वापस जाएं (जो लापता अतिरिक्त रेखा को 50 बनाने के लिए पकड़ लेता है)।


10

यह एक काम है awk

awk '(NR%50==15) || (NR%50==25)' inputfile

संपादित करें: मैं ओपी में sed अनुदेश द्वारा भ्रमित किया गया था।


9

साथ में perl

1) awkसमाधान के समान , $.चर भंडार लाइन संख्या

$ seq 135 | perl -ne 'print if $.%50==15 || $.%50==25'
15
25
65
75
115
125

2) लाइन नंबरों की सूची के खिलाफ जाँच करें, विस्तार करने के लिए आसान है

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25)'
15
25
65
75
115
125

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25,32)'
15
25
32
65
75
82
115
125
132

4

एक सूची का उपयोग करने के सुदीप के विचार के आधार पर, awk का उपयोग करते हुए एक और दृष्टिकोण :

awk 'BEGIN { a[15] a[25] }; NR % 50 in a'

aजिन लाइनों को आप प्रिंट करना चाहते हैं, उनके आधार पर सरणी में कुंजी सेट करें । उन पंक्तियों को प्रिंट करें जहां NR % 50सरणी में किसी एक कुंजी से मेल खाती है।


प्रदर्शन के कुछ संकेत देने के लिए, मैंने इस दृष्टिकोण को समय दिया और अन्य उत्तरों की तुलना में, user3 रनों के लिए औसत समय लिया।

0.276s

$ time awk 'BEGIN { a[15] a[25] }; NR % 50 in a' <(seq 1000000) > /dev/null

0.374s

$ time awk 'NR % 50 == 15 || NR % 50 == 25' <(seq 1000000) > /dev/null

0.384s

$ time perl -ne 'print if $.%50==15 || $.%50==25' <(seq 1000000) > /dev/null

0.542s

$ time perl -ne 'print if grep {$_==$.%50} (15,25)' <(seq 1000000) > /dev/null
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.