awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
-F
Flaga przedstawia separator dziedzinie; Umieszczam go w cudzysłowie, ponieważ jest to specjalny znak powłoki.
- Następnie
$1 ~ /smiths/
stosuje następujący {blok kodu} tylko do wierszy, w których pierwsze pole odpowiada wyrażeniu regularnemu /smiths/
.
- Reszta jest taka sama jak kod.
Zauważ, że ponieważ tak naprawdę nie używasz wyrażenia regularnego tutaj, tylko konkretna wartość, możesz równie łatwo użyć:
awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename
Który sprawdza równość ciągów. Jest to równoważne z użyciem wyrażenia regularnego /^smiths$/
, jak wspomniano w innej odpowiedzi, która obejmuje ^
kotwicę dopasowującą tylko początek łańcucha (początek pola 1) i $
kotwicę, która pasuje tylko do końca łańcucha. Nie jestem pewien, czy znasz się na wyrażeniach regularnych. Są bardzo potężne, ale w tym przypadku można równie łatwo zastosować kontrolę równości łańcucha.
unzip -lv /appl/tmp/data.lar | grep documentlibrary | awk '{sum += $1} END {print sum/1024/1024}'
Innym podejściem jest użycie tablic asocjacyjnych awk, więcej informacji tutaj . Ten wiersz daje pożądany wynik:
Jako efekt uboczny tablica przechowuje wszystkie pozostałe wartości:
Wynik:
źródło
Jak dotąd bardzo dobrze. Wszystko, co musisz zrobić, to dodać selektor przed blokiem, aby dodać sumę. Tutaj sprawdzamy, czy pierwszy argument zawiera tylko „kowale”:
Możesz to trochę skrócić, określając jako separator pola. W
awk
to generalnie dobry pomysł, aby zainicjować zmiennych w wierszu poleceń:źródło
-F
opcja określenia separatora.$NF
dotyczy „ostatniej kolumny”.źródło
cat
igrep
są tutaj niepotrzebne./smiths/{...}
jeśli nie ma wywołania grep. Jest to trywialna modyfikacja, ale zapewnia znaczące korzyści: zmniejsza liczbę uruchomionych procesów, upraszcza kontrolę błędów i czyni kod wyraźniejszym.Osobiście wolałbym, aby
awk
sekcja była tak prosta, jak to możliwe, i robiłaby jak najwięcej bez niej. Połączona logika nie wykorzystuje mocy potoków uniksowych i dlatego jest trudniejsza do zrozumienia, debugowania lub modyfikacji w ściśle powiązanych przypadkach użycia.źródło