Wstawić nową linię po każdych N liniach?

24

Jak mogę użyć narzędzi do przetwarzania tekstu, aby wstawić nowy wiersz po każdych N wierszach?

Przykład dla N = 2:

WKŁAD:

sadf
asdf
yxcv
cxv
eqrt
asdf

WYDAJNOŚĆ:

sadf
asdf

yxcv
cxv

eqrt
asdf
LanceBaynes
źródło

Odpowiedzi:

28

Z awk:

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

Z sed( GNUprzedłużeniem):

sed '0~2 a\\' inputfile

Z bash:

#!/bin/bash
lines=0
while IFS= read -r line
do
    printf '%s\n' "${line}"
    ((lines++ % 2)) && echo
done < "$1"
Książę John Wesley
źródło
2
Ocena arytmetyczne mogą być stosowane bezpośrednio jako warunek, bez potrzeby, aby [[ ]]do testu: while read line; do echo "$line"; ((lines++ % 2)) && echo; done.
manatwork
1
Należy pamiętać, że powyższe udokumentowane polecenie sed '0~2 a\ 'dodaje spację do każdej wstawionej nowej linii. Jeśli chcesz dodać do nowej linii po każdym wierszu, każdy z nich podobnie pracy: sed '0~1 a\ ', sed 'a\ 'lub po prostu sed G.
Acumenus,
5

Za pomocą paste

 paste -d'\n' - - /dev/null <file
iruvar
źródło
4
sed n\;G <infile

... wszystko czego potrzebujesz ...

Na przykład:

seq 6 | sed n\;G

WYDAJNOŚĆ:

1
2

3
4

5
6

... (i spacja następuje również po 6) ... lub ...

seq 5 | sed n\;G

WYDAJNOŚĆ:

1
2

3
4

5

(i żadne puste nie występuje po 5)

Jeśli puste miejsce powinno być zawsze pomijane w ostatniej linii:

sed 'n;$!G' <infile
mikeserv
źródło
2

Kolejny awk smak:

awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'
Glenn Jackman
źródło
1
„Ta odpowiedź została oznaczona jako niskiej jakości ze względu na jej długość i treść”. Przyjmę to ... ;-)
Hauke ​​Laging
1

sed (GNU)

Z (GNU) sed:

sed '0~2G'

Krótkie (brzydkie jak na N = 100):

sed 'n;G'

man sed wyjaśnia ~ jako:

first ~ step
Dopasuj co krok linię od pierwszej. Na przykład, `` sed -n 1 ~ 2p '' wypisze wszystkie nieparzyste linie w strumieniu wejściowym, a adres 2 ~ 5 będzie pasował co piątą linię, zaczynając od drugiej. pierwszy może wynosić zero; w tym przypadku sed działa tak, jakby był równy krokowi. (To jest rozszerzenie.)

sed (inne)

Z innymi sed (licz nowe linie):

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

Lub, aby być bardziej przenośnym, napisane jako (usuń komentarze do niektórych wersji 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

Z awkprawdopodobnie:

awk '1 ; NR%2==0 {printf"\n"} '
Izaak
źródło