Получить только целое число из wc в bash

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

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

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

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

Ответ 1

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

lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`

Ответ 2

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

wc < filename 

Ответ 3

wc $file | awk {'print "$4" "$2" "$1"'}

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

Также полезно использовать положительную логику ( "файл" ) по отрицательной ( "не каталог" )

[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}

Ответ 4

Просто:

wc -l < file_name

выполнит задание

Ответ 5

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

В OS X:

$ echo aa | wc -l

         1

В Centos:

$ echo aa | wc -l

1

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

$ echo aa | wc -l | tr -d ' '

Ответ 6

Если вы перенаправляете имя файла в 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 ...)

Ответ 7

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

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

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

ИЛИ

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

ИЛИ

wc -l $f | awk '{print $1}'

Ответ 8

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

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

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

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

Ответ 9

typeset -i a=$(wc -l fileName.dat  | xargs echo | cut -d' ' -f1)

Ответ 10

Как насчет sed?

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'

Ответ 11

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

Ответ 12

files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"

Ответ 13

Попробуйте следующее:

wc `ls` | awk '{ LINE += $1; WC += $2 } END { print "lines: " LINE  " words: " WC }'

Он создает счетчик строк и количество слов (LINE и WC) и увеличивает их со значениями, извлеченными из wc (используя $1 для первого значения столбца и $2 для второго) и, наконец, печатает результаты.

Ответ 14

Другой способ, похожий на то, что отправил @BananaNeil:

$ cat myfile.txt | wc -l

Ответ 15

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

answer=(`wc $f`)
echo -e"${answer[3]}
lines:  ${answer[0]}
words:  ${answer[1]}
bytes:  ${answer[2]}"

Выходы:   myfile.txt   линий: 10   слов: 20   байтов: 120