Problem ze skryptem bash - zliczanie wierszy, w których występuje dany wyraz

0

Mam prośbę mam taki skrypt bash

#!/bin/bash
fname=$1
cz_wody=$(grep -c OW $fname)
at_wody=$(grep -c SOL $fname)
lipid=$(grep -c AGL/BGL/GLC/LIN $fname)
wszystkie_at=$lipid+$at_wody

echo "Liczba cząsteczek wody: $cz_wody"
echo "Liczba atomów wody: $at_wody"
echo "Liczba atomów lipidów: $lipid"
echo "Liczba wszystkich atomów: $wszystkie_at"

Mam problem, bo zmienna lipid wyświetla 0, a powinna wszystkie zliczone linijki (parametr c), które mają AGL lub BGL lub GLC
ogólnie to mam w liniach coś takiego
1AGL
1AGL
1AGl
2BGL
2BGL
3GLC
.
.
.
itd.

I powinno mi zliczyć wszystkie linie, a wynik wychodzi 0"

W dodatku w
"Liczba wszystkich atomów: $wszystkie_at"
mam
Liczba wszystkich atomów: 0+18069, zamiast jednej liczby (sumy)

2
$ grep -c 'AGL/BGL/GLC/LIN' /tmp/test
0
$ grep -cE 'AGL|BGL|GLC|LIN' /tmp/test
5

3

grep -c AGL/BGL/GLC/LIN $fname - zwraca 0, ponieważ ten grep szuka stringa "AGL/BGL/GLC/LIN" ktrego nie ma.
lub w grep'ie piszemy \|
więc poprawną komendą będzie grep -c "AGL\|BGL\|GLC\|LIN" $fname

wszystkie_at=$lipid+$at_wody - tutaj dodajesz wartości zmiennych jako stringi.
Do obliczeń matematycznych służy (( wyrażenie matematyczne )), jeśli chcesz żeby zwróciło wartość to dopisujesz $ na początku.
Czyli poprawnie powinno być wszystkie_at=$(( $lipid + $at_wody ))

4

Ogólnie zdecydowanie lepiej będzie to wg mnie zapisać przy pomocy AWK a nie grepa:

awk <<EOF
/OW/ { cz_wody++; }
/SOL/ { at_wody++; }
/[AB]GL|GLC|LIN/ { lipid++; }

END {
  print "Liczba cząsteczek wody:", cz_wody
  print "Liczba atomów wody:", at_wody
  print "Liczba atomów lipidów", lipid
  print "Liczba wszystkich atomów:", (at_wody + lipid)
}
EOF < "$fname"

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