Perl
perl -ne 'print if $.%3==1;$var=$_ if $.%3==2;print $_ . $var if $.%3==0' input.txt
Idenya di sini adalah bahwa kita menggunakan operator modulo %dengan $.variabel nomor baris , untuk mencari tahu mana yang pertama, mana yang setiap detik, dan mana yang setiap baris ke-3. Untuk setiap sisa baris ke-3 adalah 0, sedangkan untuk setiap baris ke-1 dan ke-2 akan memiliki angka yang sesuai.
Uji:
$ 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.
Perbaikan kecil
Pendekatan dengan menyimpan baris kedua ke dalam variabel memiliki kelemahan. Bagaimana jika baris terakhir adalah yang "kedua", yaitu untuk nomor baris yang tersisa adalah 2? Kode asli dalam jawaban saya dan DopeGhoti tidak akan dicetak My dog is orangejika kami meninggalkan baris terakhir. Perbaikan untuk itu dalam kedua kasus adalah dengan menggunakan END{}blok kode, dengan membatalkan variabel sementara setelah pencetakan. Dengan kata lain:
$ awk 'NR%3 == 1 { print } NR%3 == 2 { delay=$0 } NR%3 == 0 { print; print delay;delay=""}END{print delay}' input.txt
dan
$ perl -ne '$s=$_ if $.%3==2;print $_ . $s and $s="" if $.%3==0 or $.%3==1;END{print $s}' input.txt
Dengan cara ini, kode ini akan berfungsi untuk jumlah baris yang berubah-ubah dalam file, bukan hanya yang dapat dibagi 3.
Perbaikan tambahan untuk masalah yang disebutkan dalam komentar
Dalam kasus awk, jika baris terakhir dalam file menghasilkan output 1 untuk $. % 3, kode sebelumnya memiliki masalah mengeluarkan baris baru kosong karena pencetakan tanpa syarat END{print delay}, karena printfungsi yang disebutkan dalam komentar selalu menambahkan baris baru ke variabel apa pun yang beroperasi. Dalam hal perlversi masalah ini tidak terjadi, karena dengan fungsi -neflags printtidak menambahkan baris baru.
Meskipun demikian, perbaikan dalam kasus awk adalah untuk membuat bersyarat, seperti yang disebutkan oleh Dope Ghoti dalam komentar adalah untuk memverifikasi panjang variabel sementara. Versi perl dari perbaikan yang sama adalah:
$ perl -ne '$s=$_ if $.%3==2;print $_ . $s and $s="" if $.%3==0 or $.%3==1;END{print $s if length $s}' input.txt