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.