Вставить новую строку после каждых N строк?

24

Как я могу использовать инструменты обработки текста для вставки новой строки после каждых N строк?

Пример для N = 2:

ВХОД:

sadf
asdf
yxcv
cxv
eqrt
asdf

ВЫХОД:

sadf
asdf

yxcv
cxv

eqrt
asdf
LanceBaynes
источник

Ответы:

28

С awk:

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

С sed( GNUрасширение):

sed '0~2 a\\' inputfile

С bash:

#!/bin/bash
lines=0
while IFS= read -r line
do
    printf '%s\n' "${line}"
    ((lines++ % 2)) && echo
done < "$1"
Принц Джон Уэсли
источник
2
Арифметические вычисления можно использовать непосредственно в качестве условия, нет необходимости для [[ ]]испытанию: while read line; do echo "$line"; ((lines++ % 2)) && echo; done.
manatwork
1
Помните, что приведенная выше документированная команда sed '0~2 a\ 'добавляет пробел к каждой вставленной новой строке. Если вы хотите добавить новую строку после каждой строки, любой из этой аналогично работы: sed '0~1 a\ ', sed 'a\ 'или просто sed G.
Acumenus
5

С помощью paste

 paste -d'\n' - - /dev/null <file
Iruvar
источник
4
sed n\;G <infile

... это все, что тебе нужно ...

Например:

seq 6 | sed n\;G

ВЫХОД:

1
2

3
4

5
6

... (и пробел также следует за 6) ... или ...

seq 5 | sed n\;G

ВЫХОД:

1
2

3
4

5

(и не следует пробела после 5)

Если пробел всегда должен быть пропущен в последнем случае строки:

sed 'n;$!G' <infile
mikeserv
источник
2

Еще один приятный вкус:

awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'
Гленн Джекман
источник
1
«Этот ответ был помечен как некачественный из-за его длины и содержания». Я приму это ... ;-)
Hauke ​​Laging
1

Sed (GNU)

С (GNU) sed:

sed '0~2G'

Короткий (некрасиво для N = 100):

sed 'n;G'

Человек Сед объясняет ~ как:

первый шаг Шаг
соответствует каждой строке шага, начиная с первой строки. Например, `` sed -n 1 ~ 2p '' напечатает все нечетные строки во входном потоке, а адрес 2 ~ 5 будет совпадать с каждой пятой строкой, начиная со второй. первым может быть ноль; в этом случае sed работает так, как если бы он был равен шагу. (Это расширение.)

сед (другое)

С другими sed (считать новые строки):

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

Или, чтобы быть более переносимым, записывается как (удалите комментарии для некоторых версий 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

С awk, вероятно:

awk '1 ; NR%2==0 {printf"\n"} '
Исаак
источник