Ich habe folgende CSV-Datei:
"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
Mich interessieren nur die Spalten V1:Alter, V2:Geschlecht, V8:Klasse1, V9:Klasse2.
Ich möchte ein Bash-Skript erstellen, das die Daten ausgibt, bei denen V9 gleich 3 ist, und die Ausgabe nach Geschlecht sortiert, wobei die weiblichen Daten zuerst angezeigt werden.
Ich bin ein absoluter Anfänger, was Bash-Skripte angeht, und obwohl ich weiß, wie ich diese Ausgabe von der Shell erhalte, ist mir bei Bash-Skriptbefehlen nur Folgendes eingefallen:
#!/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
Die Ausgabe sollte ungefähr so aussehen:
Kann jemand helfen?
Antwort1
Ein eigenes Bash-Skript ist ein guter Anfang. Aber die Verwendung geeigneter Tools kann das Leben einfacher machen. Hier ist ein Beispiel: Ihre Beispieleingabe enthält kein v9=3, also habe ich v9>=3 verwendet, nur um den Befehl zu demonstrieren.
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
Erklärung: tail -n+2 entfernt einfach die Titelzeile.
Beachten Sie, dass vor der Verwendung der Option „Spalte sortieren“ eine Tabulator- oder Leerzeichentrennung erforderlich ist.
Der zweite awk besteht darin, Leerzeichen durch Kommas zu ersetzen
Antwort2
Ihr Skript ist schon fast fertig. Sie müssen nur noch eine if-Bedingung prüfen, ob V9
gleich ist 3
. Um zuerst die weiblichen Daten anzuzeigen, würde ich vorschlagen, die while-Schleife in eine Funktion einzufügen, die das Geschlecht als erstes Argument erfordert, und die Funktion dann einmal für jedes Geschlecht auszuführen.
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
Sie müssen das Skript ausführbar machen, um es ausführen zu können:
chmod +x script.sh
./script.sh
Beachten Sie, dass die CSV-Datei, die Sie oben bereitgestellt haben, keine einzige Spalte enthält, in der V9
gleich ist 3
. Daher würde die Ausführung des obigen Skripts keine Daten ausgeben. Ich habe diese beiden Beispielspalten hinzugefügt:
50,Female,,,,,,1,3,,
50,Male,,,,,,1,3,,
und dies ist die Ausgabe des Skripts:
Grade2 = 3
Age Sex Grade2 Grade1
************************
Women
--------------
50,Female,1,3
Men
--------------
50,Male,1,3