Wie bekomme ich n Zeilen für jede m Zeilen (n <m) in der Befehlszeile?


7

Gibt es eine sehr einfache Möglichkeit (vielleicht eine Zeile mit sed zu verwenden?) , Für jede Zeile nZeilen zu erhalten , beginnend bei einer Zeile innerhalb dieses Zeilenabschnitts ?nm

Insbesondere habe ich eine Datei mit Millionen von Zeilen. Für jeweils 4 Zeilen möchte ich die ersten beiden Zeilen erhalten.

Aber ich denke, ich möchte auch eine Vorstellung davon bekommen, wie dies in anderen ähnlichen Situationen geschieht. Deshalb habe ich hier eine allgemeinere Frage gestellt.


4
Bitte bearbeiten Sie die Frage aus Gründen der Übersichtlichkeit.
mkc

1
Meinst du sed '1~3,+1 ! d' file_with_million_lines?
Costas

Vielleicht möchten Sie auch Awk in Betracht ziehen - GNU sed hat einen guten Adressierungsmodus dafür, ist aber nicht portabel.
Toby Speight

Antworten:


12

Mit gnu split:

n=2
m=4 
split -l ${m} --filter="head -n ${n}" infile

und wenn Sie dies erst nach der idritten Zeile tun möchten, leiten Sie die vorherigen Zeilen einfach weiter zu /dev/null:

n=2
m=4 
i=7
{ head -n ${i} >/dev/null; split -l ${m} --filter="head -n ${n}"; } <infile

Wenn Sie keinen Zugriff auf gnuTools haben, können Sie Folgendes verwenden awk:

awk -vn=2 -vm=4 -vi=7 'NR<=i{next}; (NR-i)%m==1{c=1}; c++<=n' infile

Dies löste das allgemeinere Problem für mich. Vielen Dank.
Kaffee

2
Einfacher awk:'NR<=i{next} c++%m<n'
dave_thompson_085

15

Sie können die ~in der Adresse in GNU sed verwenden:

sed -n '1~4p;2~4p'

Darin steht "Alle 4 Zeilen die erste Zeile drucken und alle 4 Zeilen die zweite Zeile drucken" oder "Ab Zeile 1 jede 4. Zeile drucken und ab Zeile 2 jede 4. Zeile drucken".


5

Für GNU sed

sed '3~4,+1 d' file

oder allgemeiner:

m=4
n=2
sed "$((m-n+1))~$m,+$((m-n-1)) d" file

4

Oder dies gnu sed:

sed -n -e '1~4 {N; p;}' file

-nunterdrückt die Ausgabe. Wenn in Zeile 1+4*k(k = Iterator) die aktuelle Zeile und die nächste Zeile eingelesen werden pattern spaceund pden (aktuellen) Musterraum drucken (dh die Ausgabe zeitlich aktivieren)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.