Jak wydrukować linie 15 i 25 z każdych 50 linii?

9

Mam duży plik i chciałbym drukować z każdej kolejnej 50 linii, 15 i 25 linii.

sed -n '15,25p' inputfile

Jak zmodyfikować to polecenie, aby drukować tylko linie 15 i 25 oraz zapętlać każde 50 wierszy w pliku.

Mohsen El-Tahawy
źródło

Odpowiedzi:

22
awk 'NR % 50 == 15 || NR % 50 == 25'

byłby oczywistym przenośnym sposobem.

Zwróć uwagę na sedalternatywę GNU :

sed '15~50b;25~50b;d'

Z każdym sedmożesz zawsze zrobić:

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'

(dostać następną linię 14 razy, wydrukować, następną linię 10 razy, wydrukować, następną linię 25 razy, wrócić do następnego cyklu (który pobiera brakującą dodatkową linię, aby uzyskać 50)).

Stéphane Chazelas
źródło
10

to jest praca dla awk

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

edytuj: Zostałem wprowadzony w błąd przez instrukcję sed w OP.

Archemar
źródło
9

Z perl

1) Podobnie do awkrozwiązania, $.zmienna przechowuje numer linii

$ seq 135 | perl -ne 'print if $.%50==15 || $.%50==25'
15
25
65
75
115
125

2) Sprawdź listę numerów linii, łatwiej ją rozszerzyć

$ 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
źródło
4

Inne podejście wykorzystujące awk, oparte na pomyśle Sundeep dotyczącym użycia listy:

awk 'BEGIN { a[15] a[25] }; NR % 50 in a'

Ustaw klucze w tablicy ana podstawie linii, które chcesz wydrukować. Drukuj linie, w których NR % 50pasuje jeden z klawiszy w tablicy.


Aby dać jakieś wskazówki na temat wydajności, zaplanowałem to podejście i porównałem z innymi odpowiedziami, biorąc średnio userczas na 3 przebiegi.

0,276s

$ time awk 'BEGIN { a[15] a[25] }; NR % 50 in a' <(seq 1000000) > /dev/null

0,374s

$ time awk 'NR % 50 == 15 || NR % 50 == 25' <(seq 1000000) > /dev/null

0,384s

$ 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
źródło