Inserir uma nova linha após cada N linhas?

24

Como posso usar ferramentas de processamento de texto para inserir uma nova linha após cada N linhas?

Exemplo para N = 2:

ENTRADA:

sadf
asdf
yxcv
cxv
eqrt
asdf

SAÍDA:

sadf
asdf

yxcv
cxv

eqrt
asdf
LanceBaynes
fonte

Respostas:

28

Com awk:

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

Com sed( GNUextensão):

sed '0~2 a\\' inputfile

Com bash:

#!/bin/bash
lines=0
while IFS= read -r line
do
    printf '%s\n' "${line}"
    ((lines++ % 2)) && echo
done < "$1"
Prince John Wesley
fonte
2
Avaliação Aritmética pode ser utilizado directamente como condição, não há necessidade da [[ ]]para teste: while read line; do echo "$line"; ((lines++ % 2)) && echo; done.
manatwork
1
Esteja ciente de que o comando documentado acima sed '0~2 a\ 'adiciona um espaço a cada nova linha inserida. Se você quiser adicionar uma nova linha após cada linha, qualquer um destes semelhante trabalho: sed '0~1 a\ ', sed 'a\ ', ou apenas sed G.
Acumenus 7/11
5

Usando paste

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

... é tudo o que você precisa ...

Por exemplo:

seq 6 | sed n\;G

SAÍDA:

1
2

3
4

5
6

... (e um espaço em branco também segue os 6) ... ou ...

seq 5 | sed n\;G

SAÍDA:

1
2

3
4

5

(e nenhum espaço em branco segue os 5)

Se um espaço em branco sempre deve ser omitido em uma caixa de última linha:

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

Outro sabor inábil:

awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'
Glenn Jackman
fonte
1
"Esta resposta foi sinalizada como de baixa qualidade por causa de seu tamanho e conteúdo". Eu vou aceitar isso ... ;-)
Hauke Laging
1

sed (GNU)

Com (GNU) sed:

sed '0~2G'

Curto (feio para N = 100):

sed 'n;G'

man sed explica ~ como:

first ~ step
Corresponde a cada passo da segunda linha, começando pela linha primeiro. Por exemplo, `` sed -n 1 ~ 2p '' imprimirá todas as linhas com números ímpares no fluxo de entrada, e o endereço 2 ~ 5 corresponderá a cada quinta linha, começando com a segunda. o primeiro pode ser zero; neste caso, sed opera como se fosse igual ao passo. (Esta é uma extensão.)

sed (outro)

Com outros sed (conte novas linhas):

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

Ou, para ser mais portátil, escreva como (remova comentários para algumas versões do 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

Com awk, provavelmente:

awk '1 ; NR%2==0 {printf"\n"} '
Isaac
fonte