Ini adalah file bagian
N W N N N N N N N N N
N C N N N N N N N N N
N A N N N N N N N N N
N N N N N N N N N N N
N G N N N N N N N N N
N C N N N C N N N N N
N C C N N N N N N N N
Di setiap baris saya ingin menghitung jumlah total semua karakter yang bukan "N"
output keinginan saya
1
1
1
0
1
2
2
text-processing
bioinformatics
Anna1364
sumber
sumber
sed
untuk mengganti barang-barang yang tidak Anda pedulikan danawk
untuk menghitung panjang yang tersisased 's/N//g ; s/\s//g' file | awk '{ print length($0); }'
Jawaban:
Solusi awk GNU :
FPAT='[^N[:space:]]'
- pola yang mendefinisikan nilai bidang (karakter apa pun kecualiN
karakter dan spasi)Output yang diharapkan:
sumber
sumber
awk '{print gsub(/[^ N]/,"")}'
dengan asumsi bahwa hitungan diperlukan untuk setiap baris selain karakter spasi dan
N
tr
adalah berapa banyak karakter yang digantic
untuk melengkapi set karakter yang diberikan-l
opsi, menghapus karakter baris baru dari jalur input untuk menghindari kesalahan satu per satu dan juga menambahkan karakter baris baru untuk pernyataan cetakSolusi yang lebih umum
-a
pilihan untuk secara otomatis membagi jalur input pada spasi putih, disimpan dalam@F
arraygrep {$_ ne "N"} @F
mengembalikan array semua elemen@F
yang tidak cocok dengan stringN
grep {!/^N$/} @F
scalar
akan memberikan sejumlah elemen arraysumber
Solusi awk alternatif :
gsub(...)
-gsub()
Fungsi mengembalikan jumlah penggantian yang dibuat.Hasil:
sumber
awk
Pendekatan lain (akan mengembalikan -1 untuk baris kosong).Atau dalam kompleks, itu akan mengembalikan -1 pada baris kosong, 0 pada baris spasi putih (Tab / Spasi) saja.
sumber
-1
untuk garis kosong ... tapi kemudian itu mungkin diinginkan untuk membedakan garis yang hanya terdiri dari N / spasi vs garis kosong ...tr
dan skrip shell POSIX :bash
,,ksh
danzsh
:sumber
awk '{print length()}'
untuk menghindari perulangan shell yang lebih lambat .. tapi kemudian orang bisa melakukan semuanya dengan awk sendiri ...awk
perulangan itu lebih cepat daripada perulangan shell. Tapi shell selalu ada di memori, danawk
mungkin tidak - ketikaawk
belum dimuat, atau ditukar, overhead memuatnya, ( waktu yang hilang ), bisa lebih besar daripada keuntungan berjalanawk
- terutama pada kecil lingkaran. Dalam kasus seperti itu, ( yaitu kasus ini),awk
bisa lebih lambat .awk
dalam skrip shell bisa membuat sistem merangkak merangkak seperti itu. Secara umum: hambatan latensi yang sama berlaku untuk sistem dalam firmware terbatas, atau sistem apa pun di bawah beban berat.Kombinasi singkat
tr
danawk
:Ini menghapus semua spasi Ns dari file input dan
awk
hanya mencetak panjang setiap baris.sumber
Cara mudah lainnya adalah melakukannya dengan python, yang sudah diinstal sebelumnya di sebagian besar lingkungan unix. Letakkan kode berikut dalam file .py:
Dan kemudian lakukan:
Dari terminal Anda. Apa yang dilakukan di atas adalah:
sumber