linux kabuk wc -c sayma karakterleri +1


17

Karakter sayısını saymak için wc -c komutunu kullandım, ancak bana yanlış bir sayı, karakter sayısı artı bir örnek veriyor:

echo "k" | wc -c 

bana 2 karakter veriyor

neden 1 değil?


3
-cseçenek bir bayt sayısı değil, bir karakter sayısıdır
mcalex

1
-m, --chars karakter sayısını yazdır Ben de aynı sorunu kullandım
Mohammad Karmi

Haklısın, unicode'un karakter başına iki bayt olduğunu düşündüm, ancak uni'deki ascii harflerinin hala 1 bayt olduğu anlaşılıyor. Meraklı. Düşünüyorum EOL
mcalex

1
evet, bir dosyaya "k" yazdım ve kaldırdığım 2 karakteri gösteriyor, bu yüzden 0 meraklı gösteriyor
Mohammad Karmi

Yanıtlar:


19

İçin yardım mesajına bir göz atın wc. -cOpsiyon karakter sayısını yazdırır. echoKomut varsayılan olarak satır karakteri içerir. Yeni wcsatırı gördüğünde, karakteri başka bir karakter olarak sayar ve dolayısıyla sonucunuzdaki ek sayıdır. Aşağıda gösterilen alternatiflerden birini kullanarak bunun üstesinden gelebilirsiniz; -wkelime -lsayısını ve satır sayısını sayar.

echo "k" | wc -w 
echo "k" | wc -l

Yeni satır karakterleri hariç olmak üzere, karakter sayısını elde wcetmek awkiçin ile çıkışını birbirine bağlayabilirsiniz:

wc <filename> | awk '{print $3-$1}'

wcSeçenek içermeyen varsayılan çıktı, yeni satır karakterlerinin sayısını (awk için 1 $), sözcük sayısını ve karakter sayısını (awk için $ 3) yazdırır.


tamam, bu yüzden bir kelime ve bir satır var, ama OP neden iki karakter / bayt olduğunu bilmek istiyor
mcalex

Kelime veya satır değil karakter sayısını saymak istiyorum
Mohammad Karmi

6
ahhh, yani echo -n "k" | wc -c. Bu mantıklı
mcalex

Ben dosyaya char koymak ve böylece EOF sayılır verir? ya da yeni bir hat ya da ne ?, Birden fazla karakter saymak istediğim gibi
Mohammad Karmi

2
@ user1865719: tutarlılığın önemli olduğu durumlarda daha printfönce tercih edilir echo. Özel olarak sorulmadıkça yeni satır yazdırmaz , yani yazdırılan karakter sayısını printf "k" | wc -mverir 1. Bir dosyanın ilk satırındaki karakterleri saymak için, örneğin $(($(head -1 file | wc -m)-1))( $(())yeni satır sayısını kaldırmak için kabuk aritmetiği yapmak için sarın ) veya daha iyisi: awk ve do komutlarını kullanın awk 'NR==1{print length}' file.
Daniel Andersson

14

siz echo "k", echokomut, yazdırmasını istediğiniz her şeye yeni satır karakteri ekler ("k"). Bunu -ndevre dışı bırakmak için seçeneği kullanabilirsiniz :

echo -n k | wc -c
1

Bu görünmez karakteri görüntülemek için odveya ile akışı dökebilirsiniz hd:

echo k | od -t c
0000000   k  \n

echo k | hd
00000000  6b 0a                                             |k.|

echo k | od -t a -A n
   k  nl

6

Bunun nedeni echo, dizenize yeni satır ekleyen kullanmanızdır . printfBunun yerine kullanın :

$ echo k | wc -c 
       2
$ printf k | wc -c
       1
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.