2017-10-06 4 views
-2

J'ai un jeu de données titanic.txt. Il est sous la forme - PassengerId, survivait, Classe P, Nom, sexe, âge, SibSp, Parch, Ticket, Fare, Cabine, Embarqué 1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S 2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C 3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S 4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,SComment calculer le ratio rang par rang dans unix

Si la colonne est survécut 1 alors le passager survécurent. Embarqué est le port où le passager a embarqué.

Je veux calculer le ratio des survivants au nombre total de passagers par port d'embarquement. Comment cela peut-il être fait en utilisant la commande awk?

Résultats attendus - 1 C 0.553571 Q 0.38961 S 0.336957

+0

Pourriez-vous s'il vous plaît ajouter une sortie attendue ici? Sera plus facile pour nous de guider sur cela alors. – RavinderSingh13

+0

@ RavinderSingh13 J'ai ajouté la sortie attendue –

+0

@KarthikK, votre sortie ne correspond pas à votre état. Mettez à jour votre sortie ou élaborez vos conditions – RomanPerekhrest

Répondre

0

quelque chose comme ça, non testé

awk -F, 'NR>1 {sum[$NF]+=$2} 
     END {for(k in sum) print k,sum[k]/(NR-1)}' file 

cependant, puisque le dénominateur est le nombre total de passagers, les chefs eux-mêmes pourraient être plus significatifs. Peut-être que vous vouliez avoir le taux de survie par port? Si oui, ajoutez count[$NF]++ et divisez par cela au bloc END.

+1

Vous avez une faute de frappe, utilisé tableau 'sum', accédé, tableau' count' –

+0

Droite, fixe ... – karakfa

0

Probablement cela va aider, pas sûr de la production attendue d'où vous avez Q 0.38961, vous devez expliquer clairement ce que vous avez besoin, de sorte que vous aurez une réponse rapide, sinon il sera source de confusion:

$ cat f 
1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S 
2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C 
3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S 
4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S 

# denominator- total passengers of all ports with percentage 
# example : overall there were 3 passengers survived across all port, 
# in that port wise 
$ awk -F, '{sum[$NF]+=$2; total+=$2}END{for(k in sum)print k,sum[k]/total, (sum[k]/total)*100 }' f 
C 0.333333 33.3333 
S 0.666667 66.6667 

# denominator- total records of each port, with percentage 
# example : for port S, there were 3 passengers, 2 survived, so 66.66% 
awk -F, '{sum[$NF]+=$2; oc[$NF]++}END{for(k in sum)print k,sum[k]/oc[k],(sum[k]/oc[k])*100 }' f 
C 1 100 
S 0.666667 66.6667 

# denominator- total records in file, which karakfa suggested 
$ awk -F, '{sum[$NF]+=$2}END{for(k in sum)print k,sum[k]/NR }' f 
C 0.25 
S 0.5 
0

Cette programme, pour chaque embarquement, calcule quel perceptage des personnes avec cet embarquement a survécu.

awk '{sum[NF]+=$2; tot[NF]++} END {for (emb in sum) print(emb, sum[emb]/tot[emb])}' file 
0
$ awk -F, '$2==1{a[$NF]++} END{for(i in a){print i,a[i]/NR}}' file 

$NF correspond au dernier champ c.-à-C ou S
a[$NF] crée un tableau associatif avec les clés comme $NF et augmenter la valeur de 1 à chaque fois que $2==1-à-dire votre deuxième champ est Survived 1.

Sortie:

C 0.25 
S 0.5