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