получить только целое число от wc в bash - PullRequest
103 голосов
/ 19 сентября 2010

Есть ли способ получить целое число, которое wc возвращает в bash?

В основном я хочу записать номера строк и количество слов на экран после имени файла.

output: filename linecount wordcount Вот то, что я имею до сих пор:

<code>files=`ls`
for f in $files;
do
        if [ ! -d $f ] #only print out information about files !directories
        then
                # some way of getting the wc integers into shell variables and then printing them
                echo "$f $lines $ words"
        fi
done

Ответы [ 15 ]

83 голосов
/ 29 января 2012

Самый простой ответ из всех:

wc < filename 
75 голосов
/ 08 апреля 2013

Просто:

wc -l < file_name

выполнит эту работу.Но этот вывод включает в себя префикс пробела, так как wc выравнивает число по правому краю.

55 голосов
/ 19 сентября 2010
wc $file | awk {'print "$4" "$2" "$1"'}

Отрегулируйте по мере необходимости для вашего макета.

Также лучше использовать положительную логику («это файл») вместо отрицательной («не каталог»)

[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}
50 голосов
/ 19 сентября 2010

Вы можете использовать команду cut, чтобы получить только первое слово из вывода wc (которое является строкой или количеством слов):

lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`
32 голосов
/ 27 октября 2015

Иногда wc выводит в разных форматах на разных платформах. Например:

В OS X:

$ echo aa | wc -l

         1

В Centos:

$ echo aa | wc -l

1

Таким образом, использование только вырезки может не восстановить номер. Вместо этого попробуйте tr, чтобы удалить пробелы:

$ echo aa | wc -l | tr -d ' '
20 голосов
/ 28 января 2016

Принятые / популярные ответы не работают на OSX.

Любое из следующего должно быть переносимым на BSD и Linux.

wc -l < "$f" | tr -d ' '

OR

wc -l "$f" | tr -s ' ' | cut -d ' ' -f 2

OR

wc -l "$f" | awk '{print $1}'
10 голосов
/ 20 сентября 2010

Если вы перенаправите имя файла в wc, оно пропустит имя файла на выходе.

Bash:

read lines words characters <<< $(wc < filename)

или

read lines words characters <<EOF
$(wc < filename)
EOF

Вместо использования for для итерации по выводу ls, сделайте следующее:

for f in *

, который будет работать, если есть имена файлов с пробелами.

Если вы не можете использовать globbing, вы должны перенаправить в while read цикл:

find ... | while read -r f

или использовать процесс подстановки

while read -r f
do
    something
done < <(find ...)
2 голосов
/ 25 июня 2015

Если файл небольшой, вы можете позволить себе дважды позвонить wc и использовать что-то вроде следующего, что исключает необходимость в дополнительном процессе:

lines=$((`wc -l "$f"`))
words=$((`wc -w "$f"`))

$((...)) - это Арифметическое Расширение Баш.В этом случае он удаляет все пробелы из вывода wc.

Это решение имеет больше смысла, если вам нужно либо linecount или wordcount.

2 голосов
/ 28 декабря 2012

Как насчет sed?

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'
1 голос
/ 28 июня 2013

Попробуйте это для числового результата:
nlines = $ (wc -l <$ myfile) </p>

...