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


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

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

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

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

принятые / популярные ответы do не работа на 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 *

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

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

find ... | while read -r f

или используйте замену процесса

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

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

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

на $((...)) - это Арифметические Расширения Баш. Он удаляет любые пробелы из вывода 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]}"

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


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

$ cat myfile.txt | wc -l