Yanıtlar:
GNU awk çözümü:
awk -v FPAT='[^N[:space:]]' '{ print NF }' file
FPAT='[^N[:space:]]'
- alan değerini tanımlayan desen ( N
karakter ve boşluk hariç herhangi bir karakter )Beklenen çıktı:
1
1
1
0
1
2
2
bu sayının boşluk karakteri dışındaki her satır için gerekli olduğunu varsayarsak ve N
$ perl -lne 'print tr/N //c' ip.txt
1
1
1
0
1
2
2
tr
kaç karakterin değiştirildiğidirc
verilen karakter kümesini tamamlamak-l
seçeneği, kapalı-by-one önlemek için hata girişi hattından satır karakteri şeritler ve ayrıca baskı deyimi için yeni satır karakteri ekler
Daha genel bir çözüm
perl -lane 'print scalar grep {$_ ne "N"} @F' ip.txt
-a
giriş satırını otomatik olarak @F
diziye kaydedilen beyaz boşluklara bölme seçeneğigrep {$_ ne "N"} @F
@F
dizeyle eşleşmeyen tüm öğelerin dizisini döndürürN
grep {!/^N$/} @F
scalar
dizinin eleman sayısını verecektirAlternatif awk çözümü:
awk '{ print gsub(/[^N[:space:]]/,"") }' file
gsub(...)
- gsub()
İşlev, yapılan değişiklik sayısını döndürür.Çıktı:
1
1
1
0
1
2
2
Başka bir awk
yaklaşım ( boş satırlar için -1 döndürür ).
awk -F'[^N ]' '$0=NF-1""' infile
Ya da karmaşık olarak, boş satırlarda -1 , yalnızca beyaz alanlarda (Sekmeler / Alanlar) 0 döndürür .
awk -F'[^N \t]+' '$0=NF-1""' infile
-1
boş satırlar için yazdıracaktır ... ancak daha sonra yalnızca N / boşluk ve boş satırdan oluşan satırı ayırt etmek istenebilir ...
tr
ve POSIX kabuk betiği:
tr -d 'N ' < file | while read x ; do echo ${#x} ; done
bash
,, ksh
ve zsh
:
while read x ; do x="${x//[ N]}" ; echo ${#x} ; done < file
awk '{print length()}'
Yavaş kabuk döngü önlemek için kullanabilirsiniz .. ama sonra biri awk kendisi ile her şeyi yapabilir ...
awk
döngüye olduğunu hızlı kabuk döngü daha. Ancak kabuk her zaman hafızadadır ve awk
olmayabilir - awk
zaten yüklenmediğinde veya takas edilmediğinde, yükleme yükü ( kayıp zaman ), çalıştırma avantajından daha büyük olabilir awk
- özellikle küçük bir döngü. Bu gibi durumlarda ( yani bu durumda) daha yavaşawk
olabilir .
awk
Bir kabuk komut dosyasında gereksiz yere kullanmak , böyle bir sistemin dört ayak üzerinde sürmesini sağlayabilir. Genel olarak: aynı gecikme süresi sınırlı bellenimdeki sistemlere veya ağır yük altındaki sistemlere uygulanır.
Kısa bir kombinasyonu tr
ve awk
:
$ tr -d ' N' <file.in | awk '{ print length }'
1
1
1
0
1
2
2
Bu, giriş dosyasındaki tüm N'leri siler ve awk
her satırın uzunluğunu yazdırır.
Diğer bir kolay yol, bunu unix ortamlarının çoğuna önceden yüklenmiş olarak gelen python'da yapmaktır. Aşağıdaki kodu bir .py dosyasına bırakın:
with open('geno') as f:
for line in f:
count = 0
for word in line.split():
if word != 'N':
count += 1
print(count)
Ve sonra yapın:
python file.py
Terminalinizden. Yukarıdakilerin yaptığı:
sed
şeyler yerine sen umurumda değil veawk
kalan uzunluğu saymaksed 's/N//g ; s/\s//g' file | awk '{ print length($0); }'