shell Linux wc -c conta i caratteri +1


17

Ho usato il comando wc -c per contare il numero di caratteri ma mi dà un numero errato, numero di caratteri più uno come esempio:

echo "k" | wc -c 

mi dà 2 personaggi

quindi perché non 1?


3
l' -copzione è un conteggio dei byte, non un conteggio dei caratteri
mcalex il

1
-m, --chars stampa il conteggio dei personaggi Ho usato anche questo stesso problema
Mohammad Karmi il

Hai ragione, pensavo che unicode fosse di due byte per carattere, ma sembra che le lettere ASCII in uni siano ancora 1 byte. Curioso. Sto pensando a EOL
Mcalex il

1
sì, ho digitato "k" in un file e mostra 2 caratteri l'ho rimosso, quindi mostra 0 curioso
Mohammad Karmi il

Risposte:


19

Dai un'occhiata al messaggio di aiuto per wc. L' -copzione stampa il numero di caratteri. Il echocomando include un carattere di nuova riga per impostazione predefinita. Quando wcvede la newline la conta come un altro personaggio e quindi il conteggio aggiuntivo nel tuo risultato. Puoi aggirare questo usando una delle alternative mostrate di seguito; -wconta il numero di parole e -lconta il numero di righe.

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

È possibile reindirizzare l'output di wcto awkper ottenere il numero di caratteri esclusi i caratteri di nuova riga:

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

L'output predefinito wcsenza opzioni stampa il numero di caratteri di nuova riga (da $ 1 a awk), il numero di parole e il numero di caratteri (da $ 3 a awk) in questo ordine.


ok, quindi ci sono una parola e una riga, ma OP vuole sapere perché ci sono due caratteri / byte
mcalex

Voglio contare il numero di caratteri non parole né righe
Mohammad Karmi il

5
ahhh, quindi vuoi dire echo -n "k" | wc -c. Questo ha senso
McCalex il

Ho messo il carattere nel file e dà in modo che l'EOF abbia contato? o nuova linea o cosa ?, come voglio contare più di un carattere
Mohammad Karmi il

1
@ user1865719: printfè spesso preferito prima echoquando la coerenza è importante. Non stampa una nuova riga a meno che non sia stato espressamente richiesto, quindi printf "k" | wc -mindica 1il numero di caratteri stampati. Per contare i caratteri nella prima riga di un file, si può fare ad es. $(($(head -1 file | wc -m)-1))(Avvolgerlo $(())per eseguire l'aritmetica della shell per rimuovere il conteggio della nuova riga) o anche meglio: usare awk e do awk 'NR==1{print length}' file.
Daniel Andersson,

12

quando lo fai echo "k", il echocomando aggiunge un carattere di nuova riga a qualunque cosa tu gli abbia chiesto di stampare ("k"). È possibile utilizzare l' -nopzione per disabilitare questo:

echo -n k | wc -c
1

Per visualizzare quel personaggio invisibile , puoi scaricare lo stream con odo 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

È perché stai usando echo (che ha un ritorno a capo), invece usa printf:

$ echo k | wc -c 2

$ printf k | wc -c 1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.