2009-06-10 12 views
18

मैं इस तरह कोई इनपुट फ़ाइल मिल गया है:मैं अजीब का उपयोग कर हर एन लाइनों में एक खाली रेखा कैसे डालूं?

line 1 
line 2 
line 3 
line 4 
line 5 
line 6 

मैं एक रिक्त पंक्ति हर कुछ लाइनें डालने के लिए awk का उपयोग करना चाहते; उदाहरण के लिए, प्रत्येक दो:

line 1 
line 2 

line 3 
line 4 

line 5 
line 6 

मैं अपनी फाइल में प्रत्येक एन लाइनों में रिक्त रेखा डालने के लिए कैसे अजीब हो सकता हूं?

उत्तर

17
awk '{ if ((NR % 5) == 0) printf("\n"); print; }' 

n == 5, निश्चित रूप से। n का आपका विचार जो भी हो, उसे बदलें।

+0

n = 1, निम्नलिखित काम करने के लिए लग रहे हैं: 'awk '{प्रिंट; printf ("\ n");} ''या बस ' awk '{print; प्रिंट करें "";} '' –

+0

यह पहले की रेखा को 5 वें लाइन के पहले के बजाय रखेगा। प्रिंट और प्रिंटफ को उलट करने की आवश्यकता है .. – Scrutinizer

1
$ awk -v n=5 '$0=(!(NR%n))?"\n"$0:$0' 

आप बदलना 'एन' चाहते हैं, पैरामीटर 'एन' awk के -v विकल्प द्वारा सेट करें।

+0

जब लाइन खाली होती है या शून्य होती है तो यह समस्याग्रस्त हो जाएगा। – Scrutinizer

24

एक और अधिक "awk-ish" जिस तरह से smcameron के जवाब लिखने के लिए:

awk -v n=5 '1; NR % n == 0 {print ""}' 

"1," एक शर्त है जो हमेशा सत्य होती है, और वर्तमान पंक्ति को मुद्रित करने वाली डिफ़ॉल्ट क्रिया को ट्रिगर करेगी।

+0

वही है, नहीं? प्रिंट लाइन और प्रिंट न्यूलाइन को उलट करने की आवश्यकता होगी, अन्यथा इसके बाद की बजाय प्रत्येक 5 वीं लाइन से पहले न्यूलाइन प्रिंट हो। – Scrutinizer

+0

काफी सही। अपडेट किया गया। –

+3

मैं शायद इसे '' {print} एनआर% एन == 0 {प्रिंट ""} के रूप में लिखूंगा, लेकिन यह पूरी तरह से एक शैली मुद्दा है। – Vatine

3
awk '{print; if (FNR % 5 == 0) printf "\n";}' your_file 

मुझे लगता है कि 'प्रिंट' 'printf' से पहले होना चाहिए, और एफएनआर आपके कार्य के लिए अधिक सटीक है।

3

अधिक awkishness:

awk 'ORS=NR%5?RS:RS RS' 

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

$ printf "%s\n" {1..12} | awk 'ORS=NR%5?RS:RS RS' 
1 
2 
3 
4 
5 

6 
7 
8 
9 
10 

11 
12 
संबंधित मुद्दे