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.

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


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.


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

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