Script Bash para manipular un archivo csv

Script Bash para manipular un archivo csv

Tengo el siguiente archivo csv:

    "V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","Class"
65,Female,0.7,0.1,187,16,18,6.8,3.3,0.9,1
62,Male,10.9,5.5,699,64,100,7.5,3.2,0.74,1
62,Male,7.3,4.1,490,60,68,7,3.3,0.89,1
58,Male,1,0.4,182,14,20,6.8,3.4,1,1
72,Male,3.9,2,195,27,59,7.3,2.4,0.4,1
46,Male,1.8,0.7,208,19,14,7.6,4.4,1.3,1

Solo me interesan las columnas V1:edad, V2:sexo, V8:grado1, V9:grado2.

Me gustaría crear un script bash que genere los datos donde V9 es igual a 3 y ordene el resultado por sexo, mostrando primero los datos femeninos.

Soy 100% principiante con scripts bash y aunque sé cómo obtener este resultado desde el shell, solo se me ocurrió esto cuando se trata de comandos de scripts bash:

#!/usr/bin/env bash

INPUT=./phpOJxGL9.csv
OLDIFS=$IFS
IFS=','
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }

echo Grade2 = 3
echo Age Sex Grade2 Grade1 
echo '************************'


while read V1 V2 V3 V4 V5 V6 V7 V8 V9 V10

do
      if [ $V9 -eg "3" ];
      then
      cut -d',' -f1,2,8,9 | sort -k2 -t','
      fi
      

done < $INPUT
IFS=$OLDIFS

La salida debería verse más o menos así:

ingrese la descripción de la imagen aquí

¿Alguien puede ayudar?

Respuesta1

Tu propio script bash es un buen comienzo. Pero utilizar las herramientas adecuadas puede hacer la vida más fácil. Aquí hay un ejemplo: su entrada de muestra no tiene v9=3, por lo que he usado v9>=3 solo para demostrar el comando.

tail -n+2 your-input | awk -F, '($9>=3){print $1, $2, $8, $9}' | sort -k2 | awk 'OFS="," {print $1,$2,$3,$4}'

65,Female,6.8,3.3
58,Male,6.8,3.4
62,Male,7,3.3
62,Male,7.5,3.2
46,Male,7.6,4.4

Explicación: tail -n+2 simplemente elimina la línea de título.

tenga en cuenta que debemos tener separación por tabulación o espacio antes de usar la opción ordenar columna

el segundo awk es reemplazar espacios por comas

Respuesta2

Tu guión ya está casi terminado. Lo único que queda es verificar en una condición if que V9sea igual a 3. Para mostrar primero los datos femeninos, sugeriría poner el bucle while en una función que requiera el género como primer argumento y luego ejecutar la función una vez para cada género.

INPUT=phpOJxGL9.csv
OLDIFS=$IFS
IFS=','

[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }

function readCsv {
    while read V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
    do
        requiredGender="$1"

        if [[ "$V2" == "$requiredGender" ]]
        then
            if [[ "$V9" == "3" ]]
            then
                echo "$V1,$V2,$V8,$V9"
            fi
        fi
    done < $INPUT
}

echo Grade2 = 3
echo Age Sex Grade2 Grade1 
echo '************************'

echo
echo "Women"
echo "--------------"

readCsv "Female"

echo
echo "Men"
echo "--------------"

readCsv "Male"

IFS=$OLDIFS

Tendrás que hacer que el script sea ejecutable para poder ejecutarlo:

chmod +x script.sh
./script.sh

Tenga en cuenta que el archivo csv que proporcionó anteriormente no contiene una sola columna donde V9sea igual a 3, por lo que ejecutar el script anterior no generará ningún dato. Agregué esas dos columnas de muestra:

50,Female,,,,,,1,3,,
50,Male,,,,,,1,3,,

y esta es la salida del script:

Grade2 = 3
Age Sex Grade2 Grade1
************************

Women
--------------
50,Female,1,3

Men
--------------
50,Male,1,3

información relacionada