Inserire una nuova riga dopo ogni N righe?


24

Come posso usare gli strumenti di elaborazione del testo per inserire una nuova riga dopo ogni N righe?

Esempio per N = 2:

INGRESSO:

sadf
asdf
yxcv
cxv
eqrt
asdf

PRODUZIONE:

sadf
asdf

yxcv
cxv

eqrt
asdf

Risposte:


28

Con awk:

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

Con sed( GNUestensione):

sed '0~2 a\\' inputfile

Con bash:

#!/bin/bash
lines=0
while IFS= read -r line
do
    printf '%s\n' "${line}"
    ((lines++ % 2)) && echo
done < "$1"

2
Valutazione aritmetica può essere utilizzato direttamente come condizione, non occorre che la [[ ]]di prova: while read line; do echo "$line"; ((lines++ % 2)) && echo; done.
arte

1
Tenere presente che il comando sopra documentato sed '0~2 a\ 'aggiunge uno spazio a ciascuna nuova riga inserita. Se si vuole aggiungere una nuova riga dopo ogni riga, uno di questi in modo simile lavoro: sed '0~1 a\ ', sed 'a\ ', o semplicemente sed G.
Acumenus,

5

utilizzando paste

 paste -d'\n' - - /dev/null <file

4
sed n\;G <infile

... é tutto quello di cui hai bisogno ...

Per esempio:

seq 6 | sed n\;G

PRODUZIONE:

1
2

3
4

5
6

... (e uno spazio vuoto segue anche il 6) ... o ...

seq 5 | sed n\;G

PRODUZIONE:

1
2

3
4

5

(e nessuno spazio vuoto segue il 5)

Se uno spazio deve essere sempre omesso in un caso dell'ultima riga:

sed 'n;$!G' <infile

2

Un altro sapore incredibile:

awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'

1
"Questa risposta è stata contrassegnata come di bassa qualità a causa della sua lunghezza e contenuto." Lo accetterò ... ;-)
Hauke ​​Laging,

1

sed (GNU)

Con (GNU) sed:

sed '0~2G'

Breve (brutto per N = 100):

sed 'n;G'

man sed spiega ~ come:

first ~ step
Abbina ogni step della riga che inizia per prima con la riga. Ad esempio, `` sed -n 1 ~ 2p '' stamperà tutte le linee dispari nel flusso di input e l'indirizzo 2 ~ 5 corrisponderà ogni quinta riga, iniziando con la seconda. il primo può essere zero; in questo caso, sed funziona come se fosse uguale a step. (Questa è un'estensione.)

sed (altro)

Con altri sed (conta le nuove linee):

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

Oppure, per essere più portatile, scritto come (rimuovi commenti per alcune versioni di 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

Con awk, probabilmente:

awk '1 ; NR%2==0 {printf"\n"} '
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.