Wie drucke ich die Zeilen 15 und 25 von jeweils 50 Zeilen?

9

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.

Mohsen El-Tahawy
quelle

Antworten:

22
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)).

Stéphane Chazelas
quelle
10

Das ist ein Job für awk

awk '(NR%50==15) || (NR%50==25)' inputfile

edit: Ich wurde durch sed Anweisung in OP irregeführt.

Archemar
quelle
9

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
Sundeep
quelle
4

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
Tom Fenech
quelle