Question

How can I calculate following data?

Input:

2 Printers
2 x 2 Cartridges
2 Router
1 Cartridge

Output:

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

Please note that Cartridges have been multiplied (2 x 2) + 1 = 5. I tried following but not sure how to get the number when I have (2 x 2) type of scenario:

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"

Please advise.

Était-ce utile?

La solution

Try something like this (assuming a well formatted input) ...

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. Cartridges and Cartridge are different. If you want to take care of that too, it would be even more difficult but you can modify the last awk in the pipeline.

Autres conseils

This assumes that there are only multiplication operators in the data.

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]}}'

Broken out on multiple lines:

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]
         }
     }'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top