awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
-F
příznak nastavuje oddělovač polí; Dal jsem to do jednoduchých uvozovek, protože je to speciální znak shellu.- Poté
$1 ~ /smiths/
použije následující {code block} pouze na řádky, kde první pole odpovídá regulárnímu výrazu/smiths/
. - Zbytek je stejný jako váš kód.
Všimněte si, že protože zde ve skutečnosti nepoužíváte regulární výraz, ale pouze konkrétní hodnotu, můžete stejně snadno použít:
awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename
Což kontroluje rovnost řetězců. To je ekvivalentní použití regulárního výrazu /^smiths$/
, jak je uvedeno v jiné odpovědi, která obsahuje ^
kotva, aby odpovídala pouze začátku řetězce (začátek pole 1) a $
kotva, aby odpovídala pouze konci provázku. Nejste si jisti, jak dobře jste obeznámeni s regulárními výrazy. Jsou velmi výkonné, ale pro tento případ můžete stejně snadno použít kontrolu rovnosti řetězců.
Dalším přístupem je použití awk asociativních polí, více informací zde. Tento řádek vytváří požadovaný výstup:
awk -F '|' '{a[$1] += $3} END{print a["smiths"]}' filename.txt
Jako vedlejší efekt pole ukládá všechny ostatní hodnoty:
awk -F '|' '{a[$1] += $3} END{for (i in a) print i, a[i]}' filename.txt
Výstup:
smiths 212
denniss 100
olivert 10
Zatím velmi dobré. Vše, co musíte udělat, je přidat selektor před blok a přidat součet. Zde zkontrolujeme, že první argument obsahuje pouze „kováře“:
awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'
Můžete to trochu zkrátit zadáním oddělovače polí jako možnosti. V awk
obecně je dobré inicializovat proměnné na příkazovém řádku:
awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'