WC на OSX - возврат включает в себя пробелы
Когда я запускаю команду подсчета слов в терминале OSX, как wc -c file.txt
Я получаю ответ ниже, который включает пробелы, дополненные перед ответом. Кто-нибудь знает, почему это происходит, или как я могу это предотвратить?
18000 file.txt
Я ожидаю получить:
18000 file.txt
Это происходит с использованием Bash или Bourne Shell.
5 ответов
Я полагаю, что это способ добиться правильного выравнивания выходов, и, насколько я знаю, нет опции wc, которая точно настраивает формат вывода.
Вы можете легко избавиться от них, пропуская через sed 's/^ *//'
, например.
Может быть даже более простое решение, в зависимости от того, почему вы хотите от них избавиться.
Стандарт POSIX для wc
может быть прочитано, чтобы подразумевать, что нет никаких ведущих пробелов, но не говорит это явно. Стандарты такие.
Вот что он говорит:
По умолчанию стандартный вывод должен содержать запись для каждого входного файла формы:
"%d %d %d %s\n", <newlines>, <words>, <bytes>, <file>
и не упоминает форматы для параметров с одним столбцом, таких как -c
,
Быстрая проверка показывает мне, что AIX, OSX, Solaris используют формат, который задает количество цифр для значения - для выравнивания столбцов (и различаются по количеству цифр). HPUX и Linux нет.
Так что это просто деталь реализации.
По крайней мере, под macOS/bash wc
демонстрирует поведение вывода конечных позиционных TAB.
Этого можно избежать с помощью expr:
echo -n "some words" | expr $(wc -c)
>> 10
echo -n "some words" | expr $(wc -w)
>> 2
Примечание.-n
предотвращает повторение символа новой строки, который будет считаться 1 в wc -c
Это заставляет меня ошибаться каждый раз, когда я пишу скрипт, который считает строки или символы. я желаю это wc
были определены, чтобы не выделять лишние пробелы, но это не так, поэтому мы застряли с ними.
Когда я пишу скрипт, а не
nlines=`wc -l $file`
Я всегда говорю
nlines=`wc -l < $file`
чтобы wc
Вывод не включает имя файла, но это не помогает с лишними пробелами. Уловка, которую я использую затем, состоит в том, чтобы добавить 0 к числу, как это:
nlines=`expr $nlines + 0` # get rid of trailing spaces
Это работает для меня:
var=$(cat test.txt|wc -l|sed 's/ //g')