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í:
¿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 V9
sea 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 V9
sea 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