2012-05-15 3 views
1

Как рассчитать следующие данные?Расчет с помощью оболочки Bash

Input: 

2 Printers 
2 x 2 Cartridges 
2 Router 
1 Cartridge 

Выход:

Total Number of Printers: 2 
Total Number of Cartridges: 5 
Total Number of Router: 2 

Пожалуйста, обратите внимание, что картриджи умножены (2 x 2) + 1 = 5. Я попытался следующие, но не уверен, как получить номер, когда у меня есть (2 x 2) тип сценария:

awk -F " " '{print $1}' Cartridges.txt >> Cartridges_count.txt 
CartridgesCount=`(echo 0 ; sed 's/$/ +/' Cartridges_count.txt; echo p) | dc` 

echo "Total Number of Cartridges: $CartridgesCount" 

Пожалуйста проконсультировать.

+0

Я добавил 'BC' тег, чтобы попытаться привлечь ответов. – paulmelnikow

+0

@noa 'bash' имеет сторонников 3.7K, а' bc' - нет. Добавление этого тега привлечет нулевые дополнительные ответы. – chrisaycock

+2

Это действительно нетривиально для программирования bash. Является ли это навязчивой болью или существуют внешние требования, которые заставляют вас не использовать более мощный язык? – SirDarius

ответ

0

Попробуйте что-то вроде этого (при условии, хорошо форматированный ввод) ...

sed -e 's| x | * |' -e 's|^\([ 0-9+*/-]*\)|echo $((\1)) |' YourFileName | sh | awk '{a[$2]+=$1;} END {for (var in a) print a[var] " "var;}' 

P.S. Картриджи и картридж отличаются. Если вы хотите позаботиться об этом, это будет еще сложнее, но вы можете изменить последний awk в конвейере.

1

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

awk '{$NF = $NF "s"; sub("ss$", "s", $NF); qty = $1; for (i = 2; i < NF; i++) {if ($i ~ /^[[:digit:]]+$/) {qty *= $i}}; items[$NF] += qty} END {for (item in items) {print "Total number of", item ":", items[item]}}' 

Разразившийся на нескольких линиях:

awk '{ 
     $NF = $NF "s"; 
     sub("ss$", "s", $NF); 
     qty = $1; 
     for (i = 2; i < NF; i++) { 
      if ($i ~ /^[[:digit:]]+$/) { 
       qty *= $i 
      } 
     }; 
     items[$NF] += qty 
    } 
    END { 
     for (item in items) { 
      print "Total number of", item ":", items[item] 
     } 
    }' 
Смежные вопросы