Арифметика с плавающей запятой Bash с bc дает пустой результат?

Я пытаюсь подсчитать количество вхождений слова в текстовом файле, используя grep, а затем умножить этот результат (int) на десятичное число, используя bc. Однако в результате получается просто пустое значение (я думаю, пустая строка?).

Способ, которым я подсчитываю вхождения слова в файле, заключается в следующем:

result=$(grep -i -o "$word" $file | wc -l)

а затем я пытаюсь выполнить математику с плавающей запятой с этим результатом через (где value — десятичное число):

sum="value * ( $result )" | bc

Однако в терминале я просто получаю пустые/пустые строки в результате, никаких значений или чего-то еще. Что я делаю не так?


person Yuerno    schedule 15.10.2017    source источник
comment
Если value не может быть нецелым числом, здесь нет необходимости в bc. wc -l будет выводить только целые числа.   -  person chepner    schedule 15.10.2017
comment
@chepner value может быть нецелым, поэтому я пытался использовать bc, так как я считаю, что bash сам по себе может выполнять только целочисленную арифметику.   -  person Yuerno    schedule 15.10.2017
comment
Правильный; Я просто хотел, чтобы это было сделано явно, поскольку один ответ предлагает арифметическое выражение вместо bc.   -  person chepner    schedule 15.10.2017
comment
Прояснил это в основном вопросе, спасибо!   -  person Yuerno    schedule 15.10.2017


Ответы (2)


Это простой синтаксический вопрос. Но сначала: знаете ли вы о -c для grep? Как в

grep -i -c  -o pattern file

что сэкономит вам wc.

Вы передаете вывод

sum="value * ( $result )"

через до н.э. Это не даст результата. Вы, наверное, хотите

sum=$(echo "183276 * $result" | bc)

а также

echo $sum
person Ljm Dullaart    schedule 15.10.2017
comment
grep -co учитывает только 1 для нескольких вхождений одного и того же шаблона в одну строку. - person Benjamin W.; 15.10.2017
comment
Ага; результат такой же как grep -o | wc -l - person Ljm Dullaart; 15.10.2017
comment
Я хочу сказать, что это не так ;) Попробуйте grep -oc 'x' <<< $'xx\nx' (результат: 2) и grep -o 'x' <<< $'xx\nx' | wc -l (результат: 3). - person Benjamin W.; 15.10.2017
comment
И примечание: исходный код не пытался передать вывод sum="value * ( $result )", но он интерпретировался как переменная среды только для этой команды. - person Benjamin W.; 15.10.2017
comment
Я не получил, что последний. Если я создам шел-скрипт mkiets с echo $* > iets в качестве содержимого, sum="value * ( $result ) " | ./mkiets создаст iets-файл. поэтому стандартный вывод из sum="value * ( $result ) " используется в качестве ввода для bc. - person Ljm Dullaart; 15.10.2017

Это можно сделать, используя только Bash

#!/bin/bash
result=$(grep -io "$word" "$file" | wc -l)
sum=$((value*result))
echo -e "$word founded $result times.\n$result * $value = $sum"

Вывод

darby@Debian:~$ word='toyota'
darby@Debian:~$ file="$HOME/Scrivania/file"
darby@Debian:~$ value=7
darby@Debian:~$ result=$(grep -io "$word" "$file" | wc -l)
darby@Debian:~$ sum=$((value*result))
darby@Debian:~$ echo -e "$word founded $result times.\n$result * $value = $sum"
toyota founded 2 times.
2 * 7 = 14
darby@Debian:~$

Или однострочное решение с использованием bc

darby@Debian:~$ echo "$value * $(grep -io "$word" "$file" | wc -l)" | bc
14
darby@Debian:~$
person Darby_Crash    schedule 15.10.2017
comment
echo $(command) это то же самое, что и просто command, вам не нужно так вкладывать свой однострочный элемент. - person Benjamin W.; 15.10.2017