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

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.




1

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


0

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

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

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


0

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

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

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


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

Если вы все perlравно используете , то можете также подсчитать количество слов в Perl. Более экономичный подход будет трубаtr -d '[:space:]'
tripleee
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.