Skrypt zliczający [BASH]

0

Witam,

zaczynam swoją historię z bashem.
Mam do przygotowania zadanie.

Procesowanie zamówienia


Pierwszy 0 2

Drugi 15 0

Inny 0 1

Jest plik w którym kilkukrotnie pojawia się słowo "Procesowanie zamówienia". Muszę go wyszukać, a następnie zliczyć sumę INT'ów znajdujących się 4 linijki pod tym słowem. Wiem, że trzeba użyć grepa, aby znaleźć to słowo w pliku, lecz jak mogę policzyć tą sumę?

Dziękuję bardzo z góry za pomoc i pozdrawiam.

0

Pokaż jeszcze raz ten format bo nie rozumiem do końca. Z tego co rozumiem to myślę że można bez grepa, iterując po prostu linia po linii, szukając początku patternu.

0
arciobus napisał(a):

Pokaż jeszcze raz ten format bo nie rozumiem do końca. Z tego co rozumiem to myślę że można bez grepa, iterując po prostu linia po linii, szukając początku patternu.

Leci tekst sobie w pliku .txt
abcabcabcabcabcabcabcabcabc
abcabcabcabcabcabcabcabcabc
abcabcabcabcabcabcabcabcabc
// tutaj trafiamy na poszukiwane słowo "Procesowanie zamówienia" po którym będzie występować zliczenie intów
Procesowanie zamówienia

Pierwszy 0 2

Drugi 15 0

Inny 0 1
abcabcabcabcabcabcabcabcabc
abcabcabcabcabcabcabcabcabc
abcabcabcabcabcabcabcabcabc
abcabcb
Procesowanie zamówienia

Pierwszy 0 2

Drugi 12 0

Inny 0 1
abcabcabcabcabcabcabcabcabc
...

*Z pierwszego

Pierwszy 0 2

Drugi 15 0

Inny 0 1
Suma będzie wynosić 15+2+1=18
*Z drugiego

Pierwszy 0 2

Drugi 12 0

Inny 0 1
Suma: 12+2+1=15

no i potem oczywiście suma końcowa: 18+15 = 33

1

Coś takiego wymyśliłem. Można dowolnie przerobić żeby przyjmował argumenty itd.

#!/bin/bash

file="file.txt"
totalSum=0

while IFS= read line; do
    if [[ "$line" = "Procesowanie zamówienia" ]]; then
        IFS=" " read dummy n1 n2
        IFS=" " read dummy n3 n4
        IFS=" " read dummy n5 n6
        sum=$(echo "$n1 + $n2 + $n3 + $n4 + $n5 + $n6" | bc)
        echo $sum
        totalSum=$(echo "$totalSum + $sum" | bc)
    fi
done < "$file"
echo $totalSum
0

Moim zdaniem najlepszym narzędziem do tego będzie AWK. To będzie jakoś tak:

awk 'BEGIN {
    sumowanie = 0;
    wszystkich = 0;
}

/Procesowanie zamówienia/ {
    sumowanie = 1;
    suma = 0;
    next;
}

sumowanie > 0 {
    for(i = 1; i <= NF; i++) {
        suma += $i
    }
    sumowanie++;
}

sumowanie > 3 {
    print suma;
    sumowanie = 0;
    wszystkich += suma;
    suma = 0;
    next;
}

END { print "RAZEM " wszystkich; }' file.txt

Więcej linijek niż powyżej, ale zadziała dla dowolnej ilości takich sekcji i pozwala na wpisanie nie-liczb w dowolnym miejscu. Nie zakłada też konkretnych ilości liczb w linii.

1 użytkowników online, w tym zalogowanych: 0, gości: 1