получить только целое число из 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
15 94

15 ответов:

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

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

самый простой ответ когда-либо:

wc < filename 

всего:

wc -l < file_name

сделает работу

wc $file | awk {'print "" "" ""'}

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

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

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

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

в OS X:

$ echo aa | wc -l

         1

В Centos:

$ echo aa | wc -l

1

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

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

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

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

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

или

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

или

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

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

Баш:

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

или

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

вместо for для итерации по выходу ls сделайте так:

for f in *

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

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

find ... | while read -r f

или использовать процесс замещения

while read -r f
do
    something
done < <(find ...)

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

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

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

такое решение имеет больше смысла, если вам нужно или linecount или в приложения WordCount.

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

как о sed?

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

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

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

попробуйте это:

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

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

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

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

выходы : мой файл.формат txt линий: 10 слова: 20 байт: 120

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

$ cat myfile.txt | wc -l