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.

Kaffee
quelle
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
don_crissti
quelle
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".

Choroba
quelle
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
Costas
quelle
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)

FloHe
quelle