shell linux wc -c nombre de caractères +1

17

J'ai utilisé la commande wc -c pour compter le nombre de caractères mais cela me donne un mauvais numéro, nombre de caractères plus un comme exemple:

echo "k" | wc -c 

ça me donne 2 personnages

alors pourquoi pas 1?

Mohammad Karmi
la source
3
l' -coption est un nombre d'octets, pas un nombre de caractères
mcalex
1
-m, --chars imprime le nombre de caractères J'ai également utilisé ce même problème
Mohammad Karmi
Vous avez raison, je pensais que l'unicode était de deux octets par caractère, mais il semble que les lettres ascii dans uni soient toujours de 1 octet. Curieuse. Je pense à EOL
mcalex
1
oui, j'ai tapé "k" dans un fichier et il montre 2 caractères que je l'ai supprimé, donc il montre 0 curieux
Mohammad Karmi

Réponses:

19

Jetez un œil au message d'aide de wc. L' -coption imprime le nombre de caractères. La echocommande inclut un caractère de nouvelle ligne par défaut. Quand wcvoit la nouvelle ligne, il le compte comme un autre personnage et donc le compte supplémentaire dans votre résultat. Vous pouvez contourner ce problème en utilisant l'une des alternatives indiquées ci-dessous; -wcompte le nombre de mots et -lcompte le nombre de lignes.

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

Vous pouvez diriger la sortie de wcvers awkpour obtenir le nombre de caractères à l'exclusion des caractères de nouvelle ligne:

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

La sortie par défaut de wcwith no options affiche le nombre de caractères de nouvelle ligne ($ 1 à awk), le nombre de mots et le nombre de caractères ($ 3 à awk) dans cet ordre.

dîner
la source
ok, donc il y a un mot et une ligne, mais OP veut savoir pourquoi il y a deux caractères / octets
mcalex
Je veux compter le nombre de caractères, pas les mots ni les lignes
Mohammad Karmi
5
ahhh, donc tu veux dire echo -n "k" | wc -c. Cela a du sens
mcalex
Je mets le char en fichier et ça donne pour que l'EOF compte? ou nouvelle ligne ou quoi?, Comme je veux compter plus d'un char
Mohammad Karmi
2
@ user1865719: printfest souvent préféré avant echolorsque la cohérence est importante. Il n'imprime pas de nouvelle ligne à moins que cela ne soit spécifiquement demandé, donc printf "k" | wc -mdonne 1, c'est-à-dire le nombre de caractères imprimés. Pour compter les caractères dans la première ligne d'un fichier, on peut faire par exemple $(($(head -1 file | wc -m)-1))(envelopper $(())pour faire de l'arithmétique shell pour supprimer le compte de la nouvelle ligne) ou encore mieux: utiliser awk et do awk 'NR==1{print length}' file.
Daniel Andersson
12

lorsque vous echo "k", la echocommande ajoute un caractère de nouvelle ligne à tout ce que vous lui avez demandé d'imprimer ("k"). Vous pouvez utiliser l' -noption pour désactiver cela:

echo -n k | wc -c
1

Pour visualiser ce personnage invisible , vous pouvez vider le flux avec odou 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
F. Hauri
la source
6

C'est parce que vous utilisez echo, ce qui ajoute une nouvelle ligne à votre chaîne. Utilisez printfplutôt:

$ echo k | wc -c 
       2
$ printf k | wc -c
       1
pseudo
la source