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

115

Есть ли способ получить целое число, которое возвращает 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

Иордания
источник

Ответы:

58

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

lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`
Касабланка
источник
5
Дважды запускать wc для одного и того же файла неэффективно.
gawi
3
Верно, поэтому я думаю, что ответ Джеймса Бродхеда намного лучше. Я не мог приступить cutк работе над полным выводом, wc $fпотому что количество пробелов между полями варьируется.
Casablanca
1
@casablanca Вы можете сжать количество пробелов, используя 'tr -s'. В своем ответе ниже я перечислил другие портативные решения этого вопроса.
рубль
Поскольку в этом ответе мы назначаем переменную, мы могли бы убить пробелы с помощью
cycollins
88

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

wc < filename 
BananaNeil
источник
5
Но не дает желаемого результата.
Дэйв Ньютон
конечно, вы просто передаете правильные параметры, которые вы все равно передадите. например, если вы это сделаете wc -c < file name, он даст вам только целое число байтов и ничего больше.
BananaNeil
13
Я хотел сказать, что если вы собираетесь ответить на вопрос (1,5-летнего), можно также поместить всю информацию в ответ, вот и все :)
Дэйв Ньютон
упс, просто перечитайте вопрос .. #fail, я изучал, как получить только целые числа, и я использовал информацию из одного из ответов, когда я нашел лучший ответ, а затем решил опубликовать об этом. извините ..
BananaNeil
3
Вы ответили Google, вот что важно. :-)
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
82

Просто:

wc -l < file_name

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

Стен
источник
3
Чтобы получить только количество строк без пробелов: wc -l < foo.txt | xargsref - stackoverflow.com/a/12973694/149428
Тейлор
1
Итак, в то время как команда выдает ответ с ведущими пробелами, спрашивающий присваивал переменную, и это автоматически отбрасывает ведущие пробелы (по крайней мере, так было в моем опыте с более старым OSX bash). Другими словами, в lines=`wc -l < $f`результате получается переменная «строка», значение которой не имеет начальных пробелов.
cycollins
Что делать, если я использую find? Я получаю сообщение об ошибке: find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -lработает нормально, но распечатывает все файлы. Если я использую, find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <я получаю сообщение об ошибке. parse error near '\n'
Нуну Гонсалвеш
55
wc $file | awk {'print "$4" "$2" "$1"'}

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

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

[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}
Джеймс Бродхед
источник
1
В моей Windows в Cmder (bash 4.4.12) это работает: wc $file | awk '{print $4" "$2" "$1}'- апострофы вне {}.
Grzegorz Gierlik
36

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

В OS X:

$ echo aa | wc -l

         1

В Centos:

$ echo aa | wc -l

1

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

$ echo aa | wc -l | tr -d ' '
Тахсин Туркоз
источник
23

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

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

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

ИЛИ

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

ИЛИ

wc -l "$f" | awk '{print $1}'
рубль
источник
11

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

Bash:

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 ...)
Приостановлено до дальнейшего уведомления.
источник
Я все равно проголосовал за вас, но вам не нужно перенаправлять имя файла. Просто зафиксируйте это как дополнительное поле. read lines words characters filename <<< $(wc "$f")Да, и если вы использовали * для защиты от пробелов, вы также захотите заключить переменную в двойные кавычки при ее использовании.
Бруно Броноски
Использование дополнительной переменной - это действительно еще один способ сделать это, но если вы не собираетесь использовать переменную (возможно, у вас уже есть имя файла в переменной - $fв этом случае), в этом нет необходимости. Кроме того, OP спросил, как получить только целое число. Вы правы, цитируя переменную, но я не показал использование этой переменной, поэтому я не упомянул об этом. Как вы знаете, for f in *почти всегда следует использовать форму вместо вывода ls.
Приостановлено до дальнейшего уведомления.
Я полностью согласен с этим ls. Это принесет вам награду. partmaps.org/era/unix/award.html#ls
Бруно Броноски
Если вам не нужно имя файла, вы можете сделать это:read lines words characters _ <<< $(wc "$f")
@EvanTeitelman: Как уже говорилось в нескольких комментариях выше ваших. $_это просто другая переменная.
Приостановлено до дальнейшего уведомления.
3

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

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

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

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

Уолтер Тросс
источник
2

Как насчет sed?

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'
mgold
источник
1
typeset -i a=$(wc -l fileName.dat  | xargs echo | cut -d' ' -f1)
GeorgesMakarios
источник
1

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

paulonki
источник
0

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

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

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

Aif
источник
0

«Обычно я хочу записывать номера строк и количество слов на экран после имени файла».

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

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

user8155253
источник
0
files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"
Педро Рейс
источник
Если вы все perlравно используете , то можете также подсчитать количество слов в Perl. Более экономичный подход будет трубаtr -d '[:space:]'
tripleee