GNU/Linux >> Tutoriales Linux >  >> Linux

Usar awk para sumar los valores de una columna, en función de los valores de otra columna

awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
  • El -F flag establece el separador de campos; Lo puse entre comillas simples porque es un carácter de shell especial.
  • Entonces $1 ~ /smiths/ aplica el siguiente {bloque de código} solo a las líneas donde el primer campo coincide con la expresión regular /smiths/ .
  • El resto es igual a su código.

Tenga en cuenta que dado que realmente no está usando una expresión regular aquí, solo un valor específico, podría usar fácilmente:

awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename

Que comprueba la igualdad de cadenas. Esto es equivalente a usar la expresión regular /^smiths$/ , como se menciona en otra respuesta, que incluye el ^ ancla para que solo coincida con el inicio de la cadena (el inicio del campo 1) y el $ ancla para que solo coincida con el final de la cadena. No estoy seguro de qué tan familiarizado está con las expresiones regulares. Son muy poderosos, pero para este caso podría usar una verificación de igualdad de cadenas con la misma facilidad.


Otro enfoque es usar arreglos asociativos awk, más información aquí. Esta línea produce la salida deseada:

awk -F '|' '{a[$1] += $3} END{print a["smiths"]}' filename.txt

Como efecto secundario, la matriz almacena todos los demás valores:

awk -F '|' '{a[$1] += $3} END{for (i in a) print i, a[i]}' filename.txt

Salida:

smiths 212
denniss 100
olivert 10

Muy bien hasta ahora. Todo lo que necesita hacer es agregar un selector antes del bloque para agregar la suma. Aquí comprobamos que el primer argumento contiene solo "smiths":

awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'

Puede acortar esto un poco especificando el separador de campo como una opción. En awk generalmente es una buena idea inicializar las variables en la línea de comando:

awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'

Linux
  1. Usando awk para imprimir todas las columnas desde la enésima hasta la última

  2. usando awk con condiciones de valor de columna

  3. Cortar los videos según la hora de inicio y finalización usando ffmpeg

  4. grep para buscar datos en la primera columna

  5. ¿Cómo reemplazar el contenido de una columna específica con awk?

Usando el comando libre de Linux

Uso del archivo de configuración SSH

Tutorial sobre el uso del comando Timeout en Linux

Linux:¿agregar una columna a un CSV que es una suma de las dos columnas anteriores?

Otro solucionador de rompecabezas de Sudoku usando AWK

Filtre un archivo .CSV según los valores de la quinta columna de un archivo e imprima esos registros en un nuevo archivo