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.