पर्ल
perl -ne 'print if $.%3==1;$var=$_ if $.%3==2;print $_ . $var if $.%3==0' input.txt
यहां विचार यह है कि हम %
लाइन नंबर $.
चर के साथ मॉडुलो ऑपरेटर का उपयोग करते हैं , यह पता लगाने के लिए कि कौन सा प्रत्येक पहले है, कौन सा प्रत्येक दूसरा है, और कौन सा प्रत्येक 3 लाइन है। प्रत्येक तीसरी पंक्ति के लिए शेष 0 है, जबकि प्रत्येक 1 और 2 पंक्ति के लिए इसकी संख्या समान होगी।
परीक्षा:
$ cat input.txt
gi_1234
My cat is blue.
I have a cat.
gi_5678
My dog is orange.
I also have a dog.
$ perl -ne 'print if $.%3==1;$var=$_ if $.%3==2;print $_ . $var if $.%3==0' input.txt
gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.
मामूली सुधार
एक चर में दूसरी पंक्ति के भंडारण के दृष्टिकोण में दोष है। क्या होगा यदि अंतिम पंक्ति "दूसरी" एक है, अर्थात उस पंक्ति की शेष संख्या 2 है? मेरे और डोपगोटी के उत्तर में मूल कोड प्रिंट नहीं होगा My dog is orange
यदि हम अंतिम पंक्ति को छोड़ देते हैं। दोनों मामलों में इसके लिए फिक्स END{}
कोड ब्लॉक का उपयोग करना है , मुद्रण के बाद अस्थायी चर को परेशान करने के साथ। दूसरे शब्दों में:
$ awk 'NR%3 == 1 { print } NR%3 == 2 { delay=$0 } NR%3 == 0 { print; print delay;delay=""}END{print delay}' input.txt
तथा
$ perl -ne '$s=$_ if $.%3==2;print $_ . $s and $s="" if $.%3==0 or $.%3==1;END{print $s}' input.txt
इस तरह, कोड एक फ़ाइल में मनमानी संख्या के लिए काम करेगा, न कि 3 से विभाज्य।
टिप्पणियों में उल्लिखित मुद्दे के लिए अतिरिक्त फिक्स
Awk के मामले में, यदि फ़ाइल में अंतिम पंक्ति $ 1 के आउटपुट का उत्पादन करती है। % 3, पिछले कोड में बिना शर्त के मुद्रण के कारण रिक्त न्यूलाइन को आउटपुट करने का मुद्दा है END{print delay}
, क्योंकि print
टिप्पणियों में उल्लेखित फ़ंक्शन हमेशा न्यूलाइन को जो भी चर पर चल रहा है, को जोड़ देता है। perl
संस्करण के मामले में यह समस्या नहीं होती है, क्योंकि -ne
झंडे print
समारोह के साथ नई रेखा को जोड़ते नहीं हैं।
फिर भी, awk के मामले में सुधार सशर्त बनाना है, जैसा कि टिप्पणियों में डोप घोटी ने उल्लेख किया है, अस्थायी चर की लंबाई को सत्यापित करना है। समान फिक्स का पर्ल संस्करण होगा:
$ perl -ne '$s=$_ if $.%3==2;print $_ . $s and $s="" if $.%3==0 or $.%3==1;END{print $s if length $s}' input.txt