оболонка lc-wc-кількість символів +1


17

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

echo "k" | wc -c 

це дає мені 2 символи

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


3
-cваріантом є кількість байт, а не кількість символів
mcalex

1
-m, --chars надрукувати кількість символів Я також використовував цю ж проблему
Mohammad Karmi

Ви маєте рацію, я подумав, що unicode - два байти на char, але, схоже, букви ascii в uni все ще мають 1 байт. Цікавий. Я думаю про EOL
mcalex

1
так, я набрав "k" у файл, і він показує 2 символи, і я його видалив, тому він показує 0 цікаво
Мохаммед Кармі

Відповіді:


19

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

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

Ви можете передавати висновок wcдля, awkщоб отримати кількість символів, виключаючи символи нового рядка:

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

Вихід за замовчуванням wcбез параметрів виводить у цьому порядку кількість символів нового рядка ($ 1 до awk), кількість слів та кількість символів ($ 3 to awk).


добре, значить, є одне слово та один рядок, але ОП хоче знати, чому є два символи / байти
mcalex

Я хочу порахувати кількість символів, ані слова, ані рядки
Мохаммед Кармі

6
ааа, значить, ти маєш на увазі echo -n "k" | wc -c. Це має сенс
mcalex

Я помістив char у файл, і він дає так, щоб EOF підрахував? або новий рядок, або що ?, Як я хочу порахувати більше одного чару
Мохаммед Кармі

2
@ user1865719: printfчасто надається перевагу раніше, echoколи важлива послідовність. Він не друкує новий рядок, якщо спеціально не запитується, так не printf "k" | wc -mдає 1, тобто кількість друкованих символів. Для підрахунку символів у першому рядку файлу можна зробити, наприклад, $(($(head -1 file | wc -m)-1))(обернути його, $(())щоб зробити арифметику оболонки, щоб видалити кількість нових рядків) або ще краще: використовувати awk та do awk 'NR==1{print length}' file.
Даніель Андерссон

14

коли ви 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.