Her 50 satırdan 15 ve 25 numaralı satırlar nasıl yazdırılır?


9

Büyük bir dosyam var ve her ardışık 50 satırdan, 15. ve 25. satırlardan yazdırmak istiyorum .

sed -n '15,25p' inputfile

Yalnızca 15 ve 25 satırlarını yazdırmak ve dosyadaki her 50 satırın üzerinden döngü oluşturmak için bu komut nasıl değiştirilir.

Yanıtlar:


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

taşınabilir bir yol olurdu.

Bir GNU sedalternatifine dikkat edin:

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

Herhangi biriyle sed, her zaman şunları yapabilirsiniz:

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'

(sonraki satırı 14 kez alın, yazdırın, sonraki satırı 10 kez yazdırın, sonraki satırı 25 kez yazdırın, bir sonraki döngüye geri dönün (bu, eksik ekstra satırı 50 yapmak için alır)).


10

bu bir iş awk

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

edit: Ben OP sed talimat tarafından yanıltıcı oldu.


9

İle perl

1) Çözüme benzer şekilde awk, $.değişken satır numarasını kaydeder

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

2) uzatmak daha kolay, hat numaraları listesine karşı kontrol edin

$ 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

Awk kullanan başka bir yaklaşım, Sundeep'in bir liste kullanma fikrine dayanır :

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

Dizideki tuşları ayazdırmak istediğiniz çizgilere göre ayarlayın . Dizideki NR % 50anahtarlardan biriyle eşleşen satırları yazdırın .


Performansın bir göstergesini vermek için, bu yaklaşımı zamanladım ve diğer cevaplarla karşılaştırdım, user3 çalışma için ortalama bir zaman ayırdım.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.