Bir grep eşleşmesinden sonra dosyadaki satır sayısını nasıl sayabilirim?


14

Bir csv dosyasındaki sorunlu bir satırdan sonra satır sayısını saymaya çalışıyorum. grep -a #Bir eşleşme bulunduktan sonra # satır sayısını çıkarmak için sözdizimini kullanabileceğimin farkındayım . Sadece gerçek hat sayısıyla ilgileniyorum. Sayıyı MAX_INT olarak ayarlayabildiğimi, bir dosyaya koyabildiğimi ve biraz daha fazla işlem yapabileceğimin farkındayım.

Bana sayıyı söylemek için kısa ve öz bir teker teker arıyorum.

Herhangi bir öneri?

Yanıtlar:


15
{ grep -m1 match; grep -c ''; } <file

Bu GNU grepve lseek()güçlü bir dosya ile çalışacaktır . Birincisi grep1 -match'de duracak ve ikincisi -cgirişte kalan her satırı dolduracak.

GNU olmadan grep:

{ sed '/match/q'; grep -c ''; } <file

Tabii ki, w / grepdışında diğer seçeneklerinin herhangi birini / hepsini kullanabilirsiniz ve bir maçta durmak hiç gerekli değildir.


Bunların her ikisi de çizgiyi yazdırır ve ikincisi ilk eşleşmeye kadar yazdırır ve sonra benim için 0?
123

@ User112638726 - ilk maçın çıktısını grep -m1 match >/dev/nullelbette bırakabilirsiniz . Ve ikinci probleminiz bir GNU'dur sed- spesifikasyon başına giriş ofsetini sıfırlamaz. -uW / GNU kullanmanız gerekir - ki bu her zaman arzu edilmez. Daha net olabilirdim, ama bir GNU grepve GNU'nun sedçiftler halinde olacağı varsayımımdı . Ayrıca, yönlendirmeyi grep -qm1kısaltmak için de işe yarayabilir /dev/null- ancak GNU grepgarip şeyler yapar -qve bu ikisinin birlikte nasıl çalıştığını hatırlayamıyorum.
mikeserv

1
Güzel cevap - gerçekten komut gruplarının gücünü gösterir. Emin değilim, ama sanırım wc -lbiraz daha ucuz grep -c ''.
Dijital Travma

1
@DigitalTrauma - Evet, bunu (geçmişe baktığımda) düşündüm, ama ben zaten yazmıştım ve neredeyse kafiyeli, bu yüzden yeterince yalnız bırakacağımı düşündüm. Her neyse, sen de dedin, şimdi rahat uyuyacağım.
mikeserv

9

İşte bir yol.

$ cat foo
aaa
bbb
ccc
ddd
eee
fff
$ awk '/^ddd/{a=FNR}END{print FNR-a}' foo
2
$

4
bu codegolf değil, detaylar verebilir misiniz (FNR, END ve benzeri)?
Archemar

3
Elbette. awk, giriş kayıt numarasını tanımlamak için FNR kullanır. END, dosyanın sonuna ulaşmak için yürütülen koddur. Bir eşleşme bulunduğunda, geçerli kayıt numarası kaydedilir. Dosyanın sonuna ulaşıldığında, bu sayı dosyadaki toplam satır sayısından çıkarılır.
Steve

1
Ayrıca tek bir dosya olarak NR'yi kullanabilir.
123

6

Başka bir yol - kullanımı dcbiraz ezoterik, ancak burada güzel çalışıyor gibi görünüyor:

sed -n '/problem/=;$=' prob.txt | dc -e '??r-p'

sedprob.txt"problem" i ve son satırı arar ve =her ikisinin satır numarasını çıktılamak için komutu kullanır .

dc bu iki değeri yığına okur, ters çevirir, çıkarır ve farkı yazdırır.


5

Tamamen sed ile (bir boru ile iki komut olsa da)

sed '/ddd/,$!d' file | sed -n '$='

Satırdan önceki tüm satırı siler ve sonraki komut yeni dosyadaki satırları sayar.


3

Bu, sorunlu olana (ve dahil) tüm satırları silmeli ve sonra kalan satırları saymalıdır:

sed '1,/problem/d' data.txt | wc -l

1
("problem" varsaymak ilk satırda değildir)
Stéphane Chazelas
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.