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.
źródło
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.
awk 'NR % 50 == 15 || NR % 50 == 25'
byłby oczywistym przenośnym sposobem.
Zwróć uwagę na sed
alternatywę GNU :
sed '15~50b;25~50b;d'
Z każdym sed
moż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)).
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.
Z perl
1) Podobnie do awk
rozwią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
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 a
na podstawie linii, które chcesz wydrukować. Drukuj linie, w których NR % 50
pasuje 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 user
czas 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