“X” ler arasındaki satırları sayma


13

"X" ler arasındaki çizgileri saymak istiyorum. Bu sadece bir örnek; Kodu karmaşık bir biyolojik sonuca uygulamak zorundayım. Eğer tercihen kullanarak, bazı komutu önerebilirsiniz eğer müteşekkir olacak awk, grepyoksa sedben o aşina olduğum gibi.

Misal:

X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X

Istenilen çıktı:

3
4
1

2
Bu alanda çalışacaksanız Biyoinformatik ile ilgilenebilirsiniz .
terdon

Yanıtlar:


13

İle awk:

$ awk '!/X/{count++}/X/{print count; count = 0}' input

3
4
1

İçermeyen her satır için bir sayı artırın X; içeren satırların sayısını yazdırın ve sıfırlayın X.


2
İlk satır bir olmasaydı, ilk satır Xeşleşene kadar ilk satır sayısı hala sayılır ve bu çözümle Xçıkarılır. EX (Yorumlara yeni satır eklenemez, ancak her karakter arasında yeni bir satır olduğunu düşünün; P): Y X Y Y X Y Y Yçıktı:1 2
Dan

1
@muru bu olmaz iş sonunda hiçbir X (gerek eklenti varsa END{if (count)print count}) ve X ekleyebilirsiniz önlemek için baştan içinde nerede boş satır üreten /X/&&countde durum
αғsнιη

1
Heh. Bir yorum, baştaki Ys'nin sayılmaması gerektiğinden şikayetçidir, çünkü tam olarak iki Xs arasında değildirler ; Diğeri, Ytam olarak iki Xsaniye arasında olmadıklarından , takip edenlerin sayılmadığından şikayet eder . Gerekirse OP'nin açıklığa kavuşmasını bekleyeceğim; O zamana kadar olduğu gibi bu cevapta iyiyim.
muru

12
$ awk '/X/ && prev{print NR-prev-1} /X/{prev=NR}' file
3
4
1

Nasıl çalışır:

Awk girdi dosyalarını satır satır okur.

  • /X/ && prev{print NR-prev-1}

    İçeren herhangi bir satır için Xve daha önce bir değer atadıysak prev, geçerli satırın sayısını eksi bir NRekleyerek yazdırın prev.

  • /X/{prev=NR}

    İçeren herhangi bir satır için X, değişkeni prevgeçerli satır numarasına ayarlayın NR.


4
Hah, güzel. Kötüye NRbana bir fikir verir:awk '/X/{print NR - 1; NR = 0}' foo
Muru

Teşekkür ederim, bana kesin bilgiyi veriyor. gerekli.
Rhea

Muro: Güzel ve zor. Bir değeri çok fazla basmak dışında benim için gawk ve mawk altında çalışır. Bunun garantili davranış olup olmadığını merak ediyorum. @EdMorton?
John1024

3
@rhea İlk satırınız her zaman bir olmadığı sürece, Xmuru cevabının altındaki bir yorumda açıkladığım gibi 2 cevap arasında çıktıda küçük bir fark vardır.
Dan

1
@ John1024 teşekkür ederim! Umarım bana yardımcı olur.
Rhea

6

awkOP'nin örnek verileri üzerinde çalışan ve Xilk ya da son ya da tekrarlanan X'lerde olmasa da çalışan bir başka basit yaklaşım .

awk -v RS='X' 'NF{print NF}' infile

Varsayılan her satırında yalnızca bir alan herhangi FS varken Üstü doğru gelen boşluklara , aksi aşağıda sayma için genel durumda revize edildi linewise . Oradaki X yerine PATTERN kodunuzu girebilirsiniz .

awk -F'\n' -v RS='X' 'NF>2{print NF-2}'

Örnek giriş:

X
Y YYY Y
YY
YY Y YY YY Y Y
X
Y Y Y
X
Y
Y
X
X

Çıktı:

3
1
2

1

Buradaki yanıtların çoğu, Awk programına katıştırılmış normal ifadeler kullanılarak sayılacak satırın içeriğiyle eşleşir. Satırları özel karakterler (Awk veya normal ifadeler için) içerebilecek içerikle eşleştirmeniz gerekiyorsa, dizeleri eşitlik açısından karşılaştırmak daha iyi olur. Bu nedenle, aşağıdaki Awk betiğini muru cevabının bir çeşidi olarak öneriyorum :

BEGIN {
    count = 0;
}

{
    if ($0 == needle) {
        if (count) {
            print count;
            count = 0;
        }
    } else {
        count++;
    }
}

Örneğin count-rows.awk, bir metin dosyası olarak saklayın ve aşağıdaki gibi çağırın:

awk -f count-rows.awk -v needle=X input

Değerini needlebeğeninize göre ayarlayabilirsiniz . Bu yöntemin avantajı, needlesorunlardan kaçmadan rastgele bir değer içeren bir kabuk komut dosyasından programı çağırabilmenizdir :

awk -f count-rows.awk -v needle="$needle" input
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.