GNU/Linux >> Znalost Linux >  >> Linux

Pomocí awk sečte hodnoty sloupce na základě hodnot jiného sloupce

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

Linux
  1. Přidejte sloupec na konec souboru CSV pomocí 'awk' ve skriptu BASH

  2. Stříhání videí na základě času začátku a konce pomocí ffmpeg

  3. grep pro vyhledávání dat v prvním sloupci

  1. Přesuňte instalaci Linuxu pomocí btrfs na výchozím podsvazku (subvolid=0) do jiného podsvazku

  2. Použití grep vs awk

  3. Filtrujte soubor CSV na základě hodnot 5. sloupce souboru a vytiskněte tyto záznamy do nového souboru

  1. Odstraňte problémy s použitím souborového systému proc na Linuxu

  2. Použití –exclude With The Du Command?

  3. Pomocí awk vytisknete všechny sloupce od n-tého po poslední