Perl
perl -ne 'print if $.%3==1;$var=$_ if $.%3==2;print $_ . $var if $.%3==0' input.txt
แนวคิดนี้คือเราใช้ตัวดำเนินการโมดูโล%
กับ$.
ตัวแปรหมายเลขบรรทัดเพื่อหาว่าอันใดคืออันแรกทุกอันอันใดอันหนึ่งทุกวินาทีและอันไหนคือทุกบรรทัดที่ 3 สำหรับทุก ๆ ที่เหลือของบรรทัดที่ 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 รหัสต้นฉบับในคำตอบของฉันและ DopeGhoti จะไม่พิมพ์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 คือทำตามเงื่อนไขดังกล่าวโดย Dope Ghoti ในความคิดเห็นคือการตรวจสอบความยาวของตัวแปรชั่วคราว รุ่น Perl ของการแก้ไขเดียวกันจะเป็น:
$ perl -ne '$s=$_ if $.%3==2;print $_ . $s and $s="" if $.%3==0 or $.%3==1;END{print $s if length $s}' input.txt