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.
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
-c
option est un nombre d'octets, pas un nombre de caractèresRéponses:
Jetez un œil au message d'aide de
wc
. L'-c
option imprime le nombre de caractères. Laecho
commande inclut un caractère de nouvelle ligne par défaut. Quandwc
voit 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;-w
compte le nombre de mots et-l
compte le nombre de lignes.Vous pouvez diriger la sortie de
wc
versawk
pour obtenir le nombre de caractères à l'exclusion des caractères de nouvelle ligne:La sortie par défaut de
wc
with 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.la source
echo -n "k" | wc -c
. Cela a du sensprintf
est souvent préféré avantecho
lorsque la cohérence est importante. Il n'imprime pas de nouvelle ligne à moins que cela ne soit spécifiquement demandé, doncprintf "k" | wc -m
donne1
, 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 doawk 'NR==1{print length}' file
.lorsque vous
echo "k"
, laecho
commande ajoute un caractère de nouvelle ligne à tout ce que vous lui avez demandé d'imprimer ("k"). Vous pouvez utiliser l'-n
option pour désactiver cela:Pour visualiser ce personnage invisible , vous pouvez vider le flux avec
od
ouhd
:la source
C'est parce que vous utilisez
echo
, ce qui ajoute une nouvelle ligne à votre chaîne. Utilisezprintf
plutôt:la source