Masukkan baris baru setelah setiap N baris?

24

Bagaimana saya bisa menggunakan alat pemrosesan teks untuk menyisipkan baris baru setelah setiap baris N?

Contoh untuk N = 2:

MEMASUKKAN:

sadf
asdf
yxcv
cxv
eqrt
asdf

KELUARAN:

sadf
asdf

yxcv
cxv

eqrt
asdf
LanceBaynes
sumber

Jawaban:

28

Dengan awk:

awk ' {print;} NR % 2 == 0 { print ""; }' inputfile

Dengan sed( GNUekstensi):

sed '0~2 a\\' inputfile

Dengan bash:

#!/bin/bash
lines=0
while IFS= read -r line
do
    printf '%s\n' "${line}"
    ((lines++ % 2)) && echo
done < "$1"
Pangeran John Wesley
sumber
2
Evaluasi aritmatika dapat digunakan secara langsung sebagai kondisi, tidak perlu untuk [[ ]]untuk menguji: while read line; do echo "$line"; ((lines++ % 2)) && echo; done.
manatwork
1
Ketahuilah bahwa perintah yang didokumentasikan di atas sed '0~2 a\ 'menambah ruang untuk setiap baris yang dimasukkan. Jika Anda ingin menambahkan baris baru setelah setiap baris, semua ini sama kerja: sed '0~1 a\ ', sed 'a\ ', atau hanya sed G.
Acumenus
5

Menggunakan paste

 paste -d'\n' - - /dev/null <file
iruvar
sumber
4
sed n\;G <infile

... semua yang kamu butuhkan ...

Sebagai contoh:

seq 6 | sed n\;G

KELUARAN:

1
2

3
4

5
6

... (dan kosong juga mengikuti 6) ... atau ...

seq 5 | sed n\;G

KELUARAN:

1
2

3
4

5

(dan tidak ada yang kosong mengikuti 5)

Jika kosong harus selalu dihilangkan dalam kasus baris terakhir:

sed 'n;$!G' <infile
mikeserv
sumber
2

Rasa awk lainnya:

awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'
glenn jackman
sumber
1
"Jawaban ini ditandai sebagai berkualitas rendah karena panjang dan isinya." Saya akan menerimanya ... ;-)
Hauke ​​Laging
1

sed (GNU)

Dengan (GNU) sed:

sed '0~2G'

Pendek (jelek untuk N = 100):

sed 'n;G'

man sed menjelaskan ~ sebagai:

first ~ step
Cocokkan setiap baris step'th dimulai dengan baris pertama. Sebagai contoh, `` sed -n 1 ~ 2p '' akan mencetak semua baris bernomor ganjil dalam aliran input, dan alamat 2 ~ 5 akan cocok dengan setiap baris kelima, dimulai dengan yang kedua. pertama bisa nol; dalam hal ini, sed beroperasi seolah-olah sama dengan langkah. (Ini adalah ekstensi.)

sed (lainnya)

Dengan sed lainnya (Hitung baris baru):

sed -e 'p;s/.*//;H;x;/\n\{2\}/{g;p};x;d'

Atau, agar lebih portabel, ditulis sebagai (hapus komentar untuk beberapa versi sed):

sed -e '             # Start a sed script.
         p            # Whatever happens later, print the line.
         s/.*//       # Clean the pattern space.
         H            # Add **one** newline to hold space.
         x            # Get the hold space to examine it, now is empty.
         /\n\{2\}/{   # Test if there are 2 new lines counted.
             g        # Erase the newline count.
             p        # Print an additional new line.
           }          # End the test.
         x            # match the `x` done above.
         d            # don't print anything else. Re-start.
       '              # End sed script.

awk

Dengan awk, mungkin:

awk '1 ; NR%2==0 {printf"\n"} '
Ishak
sumber