оболочка linux wc -c количество символов +1

17

Я использовал команду wc -c для подсчета количества символов, но в качестве примера я получил неправильное число, количество символов плюс один:

echo "k" | wc -c 

это дает мне 2 символа

так почему не 1?

Мухаммед Карми
источник
3
-cвариантом является количество байт, а не количество символов
mcalex
1
-m, --chars вывести количество символов. Я также использовал эту же проблему
Мохаммад Карми
Вы правы, я думал, что уникод был два байта на символ, но кажется, что буквы ASCII в универе по-прежнему 1 байт. Любопытно. Я думаю, что EOL
mcalex
1
да, я набрал "k" в файле, и он показывает 2 символа, я удалил его, поэтому он показывает 0 любопытных
Мохаммад Карми

Ответы:

19

Посмотрите на справочное сообщение для wc. -cОпция выводит количество символов. Команда echoвключает символ новой строки по умолчанию. Когда wcвидит новую строку, он считается как другой символ и, следовательно, дополнительный счет в вашем результате. Вы можете обойти это, используя одну из альтернатив, показанных ниже; -wподсчитывает количество слов и -lподсчитывает количество строк.

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

Вы можете передать вывод команды wcto, awkчтобы получить количество символов, исключая символы новой строки:

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

Вывод по умолчанию wcбез параметров выводит количество символов новой строки (от $ 1 до awk), количество слов и количество символов (от $ 3 до awk) в этом порядке.

Динеш
источник
хорошо, так что есть одно слово и одна строка, но OP хочет знать, почему есть два символа / байта
mcalex
Я хочу посчитать количество символов, а не слов или строк
Мохаммад Карми
5
аааа, так ты имеешь в виду echo -n "k" | wc -c. Это имеет смысл
mcalex
Я положил символ в файл, и он дает так, что EOF считается? или новая строка или как ?, поскольку я хочу сосчитать более одного символа
Мохаммад Карми
2
@ user1865719: printfчасто предпочитается раньше, echoкогда важна согласованность. Он не печатает новую строку, если не задан конкретный вопрос , т.е. printf "k" | wc -mдает 1количество напечатанных символов. Чтобы подсчитать символы в первой строке файла, можно сделать, например, $(($(head -1 file | wc -m)-1))(обернуть его, $(())чтобы выполнить арифметику оболочки, чтобы удалить счетчик новой строки) или, что еще лучше: использовать awk и do awk 'NR==1{print length}' file.
Даниэль Андерссон
12

когда вы echo "k", echoкоманда добавляет символ новой строки к тому, что вы попросили его распечатать («k»). Вы можете использовать -nопцию, чтобы отключить это:

echo -n k | wc -c
1

Для просмотра этого невидимого персонажа, вы можете сбросить поток ти odили 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

Это потому, что вы используете echo, что добавляет новую строку к вашей строке. Используйте printfвместо этого:

$ echo k | wc -c 
       2
$ printf k | wc -c
       1
Ник
источник