Дополнительное пространство с подсчитанным номером строки?

Я подсчитываю количество строк в моем файле с помощью этой команды на OSX:

nl=$(wc -l < ~/myfile.txt)

Скажем, nl оказывается 100. Теперь я хочу использовать результат nl в другой команде, но, как ни странно,

echo 1-$nl

дает мне 1-100 вместо 1-100 .

Демо

cv me$ nl=$(wc -l < ~/Desktop/cap.xlsx)
cv me$ echo $nl
104
cv me$ echo 1-$nl
1- 104

enter image description here

enter image description here

Почему это происходит? Как я могу получить 1-100 ?

3
28.05.2015, 01:50
2 ответа

Как определено POSIX, вывод wc должен содержать запись для каждого входного файла формы:

"%d %d %d %s\n", <newlines>, <words>, <bytes>, <file>

Но формат выходного файла псевдо printf() строки отличается от System V версии wc:

"%7d%7d%7d %s\n"

POSIX не требовал добавления лидирующих пробелов, поэтому он свободен для реализации, чтобы делать то, что он хочет. Существуют различные реализации wc, по крайней мере, с OSX и wc из сундука с реликвиями, он добавил лидирующие пробелы для вывода.

$ /usr/5bin/wc -l /tmp/file
      3  /tmp/file

GNU wc также добавляют лидирующие пробелы при чтении из стандартной оболочки внутри и без опций:

$ cat file | wc
  5       5      65

Чтобы удалить все лидирующие пробелы, в оболочке POSIX:

set -f
set -- $nl
nl=$1
set +f

Обратите внимание, что этот подход предполагает, что переменная содержит только лидирующие или скользящие пробелы, никаких пробелов посередине, как a b.

4
27.01.2020, 21:09

wc могут создавать лидирующие пробелы; это также может зависеть от того, используются ли (и сколько) опций (GNU wc, например, не будет создавать пробелов, если, как в вашем случае, используется ровно одна опция). Эти пробелы сохраняются в присваивании nl=$(...). Чтобы удалить пробелы, в качестве обходного пути, вы можете использовать любой из них:

nl=$(wc -l < ~/myfile.txt | awk '{print $1}')

или

nl=$(awk 'END{print NR}' ~/myfile.txt)

или

nl=$(wc -l < ~/Desktop/cap.xlsx)
nl=$(echo $nl)

или (но см. ниже комментарий @cuonglm для heirloom версии wc)

nl=$(wc -l < ~/Desktop/cap.xlsx)
nl=${nl##* }
4
27.01.2020, 21:09

Теги

Похожие вопросы