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- sedAlternative:
sed '15~50b;25~50b;d'
Mit jedem sedkö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 awkLö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 abasierend auf den Zeilen fest, die Sie drucken möchten. Drucken Sie Zeilen, bei denen NR % 50einer 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 user3 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