Powłoka linux wc -c zlicza znaki +1

17

Użyłem polecenia wc -c, aby policzyć liczbę znaków, ale podaje mi to niepoprawną liczbę, liczbę znaków plus jeden jako przykład:

echo "k" | wc -c 

daje mi 2 znaki

więc dlaczego nie 1?

Mohammad Karmi
źródło
3
-copcja to liczba bajtów, a nie liczba znaków
mcalex
1
-m, --chars wypisuje liczby znaków Użyłem również tego samego problemu
Mohammad Karmi
Masz rację, myślałem, że Unicode ma dwa bajty na znak, ale wydaje się, że litery ascii w uni są nadal 1 bajt. Ciekawy. Myślę, że EOL
mcalex
1
tak, wpisałem „k” w pliku i pokazuje 2 znaki, które usunąłem, więc pokazuje 0 ciekawych
Mohammad Karmi

Odpowiedzi:

19

Spójrz na komunikat pomocy dla wc. -cOpcja wypisuje liczbę znaków. echoPolecenie zawiera znak nowej linii domyślnie. Kiedy wcwidzi nowy wiersz, liczy się on jako inny znak, a zatem dodatkowy wynik w twoim wyniku. Możesz obejść ten problem, korzystając z jednej z poniższych opcji; -wliczy liczbę słów i -lliczbę wierszy.

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

Możesz przesłać dane wyjściowe wcdo, awkaby uzyskać liczbę znaków z wyłączeniem znaków nowego wiersza:

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

Domyślne wyjście wcbez opcji wypisuje liczbę znaków nowego wiersza (1 $ na awk), liczbę słów i liczbę znaków (3 $ na awk) w tej kolejności.

dinesh
źródło
ok, więc jest jedno słowo i jeden wiersz, ale OP chce wiedzieć, dlaczego są dwa znaki / bajty
mcalex
Chcę policzyć liczbę znaków, a nie słów ani wierszy
Mohammad Karmi,
6
ahhh, więc masz na myśli echo -n "k" | wc -c. To ma sens
mcalex,
Umieszczam znak w pliku i daje to, że EOF się liczył? czy nowa linia czy co ?, jak chcę liczyć więcej niż jeden znak
Mohammad Karmi
2
@ user1865719: printfczęsto jest preferowany wcześniej, echogdy ważna jest spójność. Nie drukuje nowego wiersza, chyba że zostanie o to wyraźnie poproszony, więc printf "k" | wc -mpodaje 1, tj. Liczbę wydrukowanych znaków. Aby policzyć znaki w pierwszym wierszu pliku, można np. $(($(head -1 file | wc -m)-1))(Owinąć go, $(())aby wykonać arytmetykę powłoki, aby usunąć liczbę nowych wierszy ) lub jeszcze lepiej: użyć awk i zrobić awk 'NR==1{print length}' file.
Daniel Andersson,
13

kiedy ty echo "k", echopolecenie dodaje znak nowej linii do wszystkiego, o co go poprosiłeś („k”). Możesz użyć tej -nopcji, aby to wyłączyć:

echo -n k | wc -c
1

Aby wyświetlić tę niewidzialną postać, możesz zrzucić strumień odlub 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
źródło
6

To dlatego, że używasz echo, co dodaje nowy wiersz do łańcucha. printfZamiast tego użyj :

$ echo k | wc -c 
       2
$ printf k | wc -c
       1
Nacięcie
źródło