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.

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


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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.