Insérer une nouvelle ligne après toutes les N lignes?


24

Comment puis-je utiliser des outils de traitement de texte pour insérer une nouvelle ligne après toutes les N lignes?

Exemple pour N = 2:

CONTRIBUTION:

sadf
asdf
yxcv
cxv
eqrt
asdf

SORTIE:

sadf
asdf

yxcv
cxv

eqrt
asdf

Réponses:


28

Avec awk:

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

Avec sed( GNUextension):

sed '0~2 a\\' inputfile

Avec bash:

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

2
Évaluation arithmétique peut être utilisé directement comme condition, pas besoin de le [[ ]]tester: while read line; do echo "$line"; ((lines++ % 2)) && echo; done.
manatwork

1
Sachez que la commande documentée ci-dessus sed '0~2 a\ 'ajoute un espace à chaque nouvelle ligne insérée. Si vous voulez ajouter une nouvelle ligne après chaque ligne, l' un de ces travaux de façon similaire: sed '0~1 a\ ', sed 'a\ ', ou tout simplement sed G.
Acumenus

5

En utilisant paste

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

4
sed n\;G <infile

... est tout ce dont vous avez besoin ...

Par exemple:

seq 6 | sed n\;G

SORTIE:

1
2

3
4

5
6

... (et un blanc suit également le 6) ... ou ...

seq 5 | sed n\;G

SORTIE:

1
2

3
4

5

(et aucun blanc ne suit le 5)

Si un blanc doit toujours être omis dans un cas de dernière ligne:

sed 'n;$!G' <infile

2

Une autre saveur awk:

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

1
"Cette réponse a été signalée comme étant de faible qualité en raison de sa longueur et de son contenu." Je l'accepterai ... ;-)
Hauke ​​Laging

1

sed (GNU)

Avec (GNU) sed:

sed '0~2G'

Court (moche pour N = 100):

sed 'n;G'

man sed explique ~ comme:

first ~ step
Correspond à chaque étape de la ligne commençant par la ligne en premier. Par exemple, `` sed -n 1 ~ 2p '' imprimera toutes les lignes impaires dans le flux d'entrée, et l'adresse 2 ~ 5 correspondra à chaque cinquième ligne, en commençant par la seconde. le premier peut être zéro; dans ce cas, sed fonctionne comme s'il était égal à step. (Ceci est une extension.)

sed (autre)

Avec d'autres sed (Count new lines):

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

Ou, pour être plus portable, écrit comme (supprimer les commentaires pour certaines versions de 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

Avec awk, probablement:

awk '1 ; NR%2==0 {printf"\n"} '
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.