2017-04-10 4 views
-3

Hier ist die Testdatei - rime.txt.Wo sind die zwei Zeichen wann mit awk zu zählen?

file rime.txt 
rime.txt: UTF-8 Unicode text 

rime.txt

wc -c rime.txt 
25483 rime.txt 
awk '{num=num+length($0)}END{print num}' rime.txt 
24648 

Länge ($ 0) enthalten Leerzeichen, enthalten keine Newline (0a).

awk 'END{print NR}' rime.txt 
833 

Es gibt 833 0a --newline in rime.txt.

echo "25483-24648-833" |bc 
2 

Wo sind die beiden Zeichen awk, die nicht zählen können?

wc -m rime.txt 
25481 rime.txt 

Es gibt zwei Bytes, die alle Zeichen den Plan nicht sehen, was sind sie?
Wie finde ich es heraus?

+0

'wc -c' zählt Bytes, keine Zeichen. Haben Sie Multi-Byte-Codierung? – heemayl

+0

Datei rime.txt ----- rime.txt: UTF-8 Unicode-Text –

+0

Versuchen Sie mit 'wc -m' – heemayl

Antwort

0
wc -c rime.txt 
25482 rimie.txt 
wc -m rime.txt 
25480 rime.txt 
grep -P "[^\x00-\x7F]" rime.txt 
     That come from a far Contrée. 
    And now all in mine own Countrée 
awk '/[^\x00-\x7F]/{print}' rime.txt 
     That come from a far Contrée. 
    And now all in mine own Countrée 

Der Charakter é ist beyong Wert ASCII hex, dieE9 ist.
e9 kann von wc-c (Bytes-Modus) bekannt sein; e9 nicht durch wc -m (Zeichen-Modus) bekannt sein, gibt es zwei é oder sagen e9 in rime.txt.
So wc -c rime.txt bekommen zwei mehr als wc-m rime.txt.

0

wc -c zählt Bytes, keine Zeichen. Wenn Sie eine Multi-Byte-Codierung (z. B. eine beliebige UTF-Variante) an Ort und Stelle haben, erhalten Sie nicht die korrekte Zeichenanzahl.

Sie müssen wc -m verwenden, um die Zeichen zu erhalten, unabhängig von der Codierung zählen:

wc -m rime.txt 

auch, wie Sie sich vorstellen können, für ASCII-Zeichensatz (genau, für alle Single-Byte-codierte Zeichen), würden Sie Erhalten Sie die gleiche Anzahl für wc -c und wc -m.

Verwandte Themen