Saya ingin menghitung garis antara "X". Ini hanya sebuah contoh; Saya harus menerapkan kode ke hasil biologis yang kompleks. Saya akan berterima kasih jika Anda dapat menyarankan beberapa perintah, lebih disukai menggunakan awk
, grep
atau sed
karena saya akrab dengan mereka.
Contoh:
X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X
Output yang Diinginkan:
3
4
1
Jawaban:
Dengan
awk
:Tambahkan hitungan untuk setiap baris yang tidak mengandung
X
; cetak dan atur ulang hitungan untuk baris yang berisiX
.sumber
X
, jumlah baris pertama masih akan dihitung dan dikeluarkan dengan solusi ini, sampai baris pertama denganX
dicocokkan. EX (Tidak dapat menambahkan baris baru dalam komentar, tetapi anggap ada garis baru antara masing-masing karakter; P):Y X Y Y X Y Y Y
akan menampilkan:1 2
END{if (count)print count}
), dan menghasilkan baris kosong di mana X berada di awal untuk menghindari Anda dapat menambahkan/X/&&count
dalam kondisi jugaY
tidak boleh dihitung karena mereka tidak persis di antara duaX
; yang lain mengeluh bahwa trailingY
s tidak dihitung karena mereka tidak persis di antara duaX
s. Saya akan menunggu OP untuk mengklarifikasi, jika perlu; Saya baik-baik saja dengan jawaban ini sampai saat itu.Bagaimana itu bekerja:
Awk secara implisit membaca file input baris per baris.
/X/ && prev{print NR-prev-1}
Untuk setiap baris yang berisi
X
dan jika sebelumnya kita telah menetapkan nilaiprev
, kemudian cetak jumlah baris saat iniNR
,, minusprev
minus satu./X/{prev=NR}
Untuk setiap baris yang berisi
X
, atur variabelprev
ke nomor baris saat iniNR
,.sumber
NR
memberi saya ide:awk '/X/{print NR - 1; NR = 0}' foo
X
, ada perbedaan kecil dalam output antara 2 jawaban seperti yang saya jelaskan dalam komentar di bawah jawaban muru.awk
Pendekatan sederhana lain yang bekerja pada data sampel OP dan jikaX
tidak di Xs pertama atau bahkan di Xs terakhir atau berulang.Di atas adalah benar ketika hanya ada satu bidang di setiap baris dengan FS default spasi putih , jika tidak di bawah ini direvisi dalam kasus umum untuk menghitung secara teratur . Anda dapat memasukkan POLA Anda di tempat X di sana.
Input sampel:
Outputnya adalah:
sumber
Sebagian besar jawaban di sini cocok dengan konten baris yang akan dihitung menggunakan ekspresi reguler yang disematkan ke dalam program Awk. Jika Anda perlu mencocokkan baris dengan konten yang mungkin mengandung karakter khusus (baik untuk Awk atau ekspresi reguler), akan lebih baik untuk benar-benar membandingkan string untuk kesetaraan. Karena itu saya mengusulkan skrip Awk berikut sebagai varian dari jawaban muru :
Simpan sebagai file teks, mis.
count-rows.awk
, Dan aktifkan sebagai berikut:Anda dapat menyesuaikan nilai
needle
sesuai keinginan Anda. Keuntungan dari metode ini adalah Anda dapat menjalankan program dari skrip shell dengan nilai arbitrerneedle
tanpa melarikan diri dari masalah:sumber