-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.
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
-c
opcja to liczba bajtów, a nie liczba znakówOdpowiedzi:
Spójrz na komunikat pomocy dla
wc
.-c
Opcja wypisuje liczbę znaków.echo
Polecenie zawiera znak nowej linii domyślnie. Kiedywc
widzi 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;-w
liczy liczbę słów i-l
liczbę wierszy.Możesz przesłać dane wyjściowe
wc
do,awk
aby uzyskać liczbę znaków z wyłączeniem znaków nowego wiersza:Domyślne wyjście
wc
bez opcji wypisuje liczbę znaków nowego wiersza (1 $ na awk), liczbę słów i liczbę znaków (3 $ na awk) w tej kolejności.źródło
echo -n "k" | wc -c
. To ma sensprintf
często jest preferowany wcześniej,echo
gdy ważna jest spójność. Nie drukuje nowego wiersza, chyba że zostanie o to wyraźnie poproszony, więcprintf "k" | wc -m
podaje1
, 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
.kiedy ty
echo "k"
,echo
polecenie dodaje znak nowej linii do wszystkiego, o co go poprosiłeś („k”). Możesz użyć tej-n
opcji, aby to wyłączyć:Aby wyświetlić tę niewidzialną postać, możesz zrzucić strumień
od
lubhd
:źródło
To dlatego, że używasz
echo
, co dodaje nowy wiersz do łańcucha.printf
Zamiast tego użyj :źródło