Ich habe eine große Datei und möchte aus jeder Folge 50 Zeilen, der 15. und 25. Zeile drucken .
sed -n '15,25p' inputfile
So ändern Sie diesen Befehl, um nur die Zeilen 15 und 25 zu drucken und jeweils 50 Zeilen in der Datei zu durchlaufen.
Ich habe eine große Datei und möchte aus jeder Folge 50 Zeilen, der 15. und 25. Zeile drucken .
sed -n '15,25p' inputfile
So ändern Sie diesen Befehl, um nur die Zeilen 15 und 25 zu drucken und jeweils 50 Zeilen in der Datei zu durchlaufen.
Antworten:
awk 'NR % 50 == 15 || NR % 50 == 25'
wäre der offensichtliche tragbare Weg.
Beachten Sie eine GNU- sed
Alternative:
sed '15~50b;25~50b;d'
Mit jedem sed
können Sie immer tun:
sed -n 'n;n;n;n;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n'
(14-mal nächste Zeile abrufen, 10-mal drucken, 25-mal drucken, 25-mal drucken, nächste Zeile zurück zum nächsten Zyklus (der die fehlende zusätzliche Zeile erfasst, um 50 zu ergeben)).
Mit perl
1) Ähnlich wie bei der awk
Lösung $.
speichert die Variable die Zeilennummer
$ seq 135 | perl -ne 'print if $.%50==15 || $.%50==25'
15
25
65
75
115
125
2) Überprüfen Sie anhand der Liste der Zeilennummern, die einfacher zu erweitern sind
$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25)'
15
25
65
75
115
125
$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25,32)'
15
25
32
65
75
82
115
125
132
Ein anderer Ansatz mit awk, der auf Sundeeps Idee basiert , eine Liste zu verwenden:
awk 'BEGIN { a[15] a[25] }; NR % 50 in a'
Legen Sie die Schlüssel im Array a
basierend auf den Zeilen fest, die Sie drucken möchten. Drucken Sie Zeilen, bei denen NR % 50
einer der Schlüssel im Array übereinstimmt.
Um einen Hinweis auf die Leistung zu geben, habe ich diesen Ansatz zeitlich festgelegt und mit den anderen Antworten verglichen, wobei ich durchschnittlich user
3 Läufe benötigt habe.
0,276 s
$ time awk 'BEGIN { a[15] a[25] }; NR % 50 in a' <(seq 1000000) > /dev/null
0,374 s
$ time awk 'NR % 50 == 15 || NR % 50 == 25' <(seq 1000000) > /dev/null
0,384 s
$ time perl -ne 'print if $.%50==15 || $.%50==25' <(seq 1000000) > /dev/null
0,542s
$ time perl -ne 'print if grep {$_==$.%50} (15,25)' <(seq 1000000) > /dev/null