linux shell wc -c count karakter +1

17

Saya menggunakan perintah wc -c untuk menghitung jumlah karakter tetapi itu memberi saya angka yang salah, jumlah karakter ditambah satu sebagai contoh:

echo "k" | wc -c 

itu memberi saya 2 karakter

jadi mengapa tidak 1?

Mohammad Karmi
sumber
3
yang -cpilihan adalah jumlah byte, bukan jumlah karakter
mcalex
1
-m, --chars mencetak jumlah karakter Saya juga menggunakan masalah yang sama
Mohammad Karmi
Anda benar, saya pikir unicode adalah dua byte per char, tetapi tampaknya huruf ascii di uni masih 1 byte. Ingin tahu. Saya sedang berpikir EOL
mcalex
1
ya, saya mengetik "k" dalam sebuah file dan itu menunjukkan 2 karakter saya menghapusnya, jadi itu menunjukkan 0 penasaran
Mohammad Karmi

Jawaban:

19

Lihatlah pesan bantuan untuk wc. The -cpilihan mencetak jumlah karakter. The echoperintah termasuk karakter baris baru secara default. Saat wcmelihat baris baru, ia menghitungnya sebagai karakter lain dan karenanya menambah jumlah hasil Anda. Anda dapat menyiasatinya dengan menggunakan salah satu alternatif yang ditunjukkan di bawah ini; -wmenghitung jumlah kata dan -lmenghitung jumlah baris.

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

Anda dapat menyalurkan output wcke awkuntuk mendapatkan jumlah karakter kecuali karakter baris baru:

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

Output default wctanpa opsi mencetak jumlah karakter baris baru ($ 1 hingga awk), jumlah kata dan jumlah karakter ($ 3 hingga awk) dalam urutan ini.

dinesh
sumber
ok, jadi ada satu kata dan satu baris, tetapi OP ingin tahu mengapa ada dua karakter / byte
mcalex
Saya ingin menghitung jumlah karakter bukan kata-kata atau garis
Mohammad Karmi
5
ahhh, maksudmu echo -n "k" | wc -c. Itu masuk akal
mcalex
Saya memasukkan char ke dalam file dan memberi sehingga EOF dihitung? atau baris baru atau apa? Karena saya ingin menghitung lebih dari satu char
Mohammad Karmi
1
@ user1865719: printfsering lebih disukai sebelumnya echoketika konsistensi penting. Itu tidak mencetak baris baru kecuali diminta secara khusus, jadi printf "k" | wc -mberikan 1, yaitu jumlah karakter yang dicetak. Untuk menghitung karakter di baris pertama file, seseorang dapat melakukan mis $(($(head -1 file | wc -m)-1))(membungkusnya $(())untuk melakukan shell aritmatika untuk menghapus jumlah baris baru) atau bahkan lebih baik: gunakan awk dan lakukan awk 'NR==1{print length}' file.
Daniel Andersson
12

ketika Anda echo "k", echoperintah menambahkan karakter baris baru untuk apa pun yang Anda minta untuk dicetak ("k"). Anda dapat menggunakan -nopsi untuk menonaktifkan ini:

echo -n k | wc -c
1

Untuk melihat karakter yang tidak terlihat itu , Anda dapat membuang aliran dengan odatau 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
sumber
6

Itu karena Anda menggunakan gema (yang memiliki carriage return), daripada menggunakan printf:

$ echo k | wc -c 2

$ printf k | wc -c 1
Nick
sumber