Nach jeweils N Zeilen eine neue Zeile einfügen?

24

Wie kann ich mit Textverarbeitungswerkzeugen nach jeweils N Zeilen eine neue Zeile einfügen?

Beispiel für N = 2:

EINGANG:

sadf
asdf
yxcv
cxv
eqrt
asdf

AUSGABE:

sadf
asdf

yxcv
cxv

eqrt
asdf
LanceBaynes
quelle

Antworten:

28

Mit awk:

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

Mit sed( GNUErweiterung):

sed '0~2 a\\' inputfile

Mit bash:

#!/bin/bash
lines=0
while IFS= read -r line
do
    printf '%s\n' "${line}"
    ((lines++ % 2)) && echo
done < "$1"
Prinz John Wesley
quelle
2
Arithmetic Auswertung kann direkt als Bedingung verwendet werden, keine Notwendigkeit für die [[ ]]zu Test: while read line; do echo "$line"; ((lines++ % 2)) && echo; done.
Manatwork
1
sed '0~2 a\ 'Beachten Sie, dass der oben dokumentierte Befehl jeder eingefügten Zeile ein Leerzeichen hinzufügt. Wenn Sie wollten eine neue Zeile nach jeder Zeile hinzufügen, jede dieser ähnlich Arbeit: sed '0~1 a\ ', sed 'a\ ', oder einfach nur sed G.
Acumenus
5

Verwenden paste

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

... ist alles, was du brauchst ...

Beispielsweise:

seq 6 | sed n\;G

AUSGABE:

1
2

3
4

5
6

... (und auf die 6 folgt auch ein Leerzeichen) ... oder ...

seq 5 | sed n\;G

AUSGABE:

1
2

3
4

5

(und nach der 5 folgt kein Leerzeichen)

Wenn in der letzten Zeile immer ein Leerzeichen weggelassen werden soll:

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

Ein weiterer Geschmack von awk:

awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'
Glenn Jackman
quelle
1
"Diese Antwort wurde aufgrund ihrer Länge und ihres Inhalts als minderwertig gekennzeichnet." Ich akzeptiere es ... ;-)
Hauke ​​Laging
1

sed (GNU)

Mit (GNU) sed:

sed '0~2G'

Kurz (hässlich für N = 100):

sed 'n;G'

man sed erklärt ~ als:

first ~ step
Stimmt mit jeder Zeile überein, die mit der ersten Zeile beginnt. Beispiel: "sed -n 1 ~ 2p" gibt alle ungeraden Zeilen im Eingabestream aus, und die Adresse 2 ~ 5 stimmt mit jeder fünften Zeile überein, beginnend mit der zweiten. Erstens kann Null sein. sed verhält sich in diesem Fall so, als wäre es gleich step. (Dies ist eine Erweiterung.)

sed (andere)

Mit anderen sed (Neue Zeilen zählen):

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

Oder, um portabler zu sein, geschrieben als (Kommentare für einige Versionen von sed entfernen):

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

Mit awkwahrscheinlich:

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