#1 Le 22/02/2019, à 11:57
- Ezzmazz
Extraire des lignes d'un .csv en fonction d'un motif
Bonjour,
Je planche sur un projet depuis quelques jours et il y a une commande qui m'échappe.
J'ai un fichiers CSV avec une cinquantaine de colonnes. J'aimerais extraire les lignes de ce tableau ayant une valeur supérieure à 4.00% dans la colonne 23 et de les classer de la valeur la plus grande à la plus petite. Comme je suis débutant, j'ai d'abord essayé d'extraire uniquement la colonne 23 du tableau, de garder uniquement les lignes de la colonne comprenant des valeurs supérieures à 4.00%.
Pour ce faire, voici ce que j'ai fait :
cut -d',' -f23 Mon_fichier.csv > Mon_fichier2.csv
Puis ceci pour garder uniquement les lignes avec les valeurs qui m'intéressent :
awk '$0+0>4' Mon_fichier2.csv | sort -n -r > Mon_fichier3.csv
Pourriez-vous m'expliquer comment je peux appliquer la même chose au tableau complet, afin d'extraire les lignes complètent, mais seulement celles ayant une valeur de plus de 4.00% dans la colonne 23 ?
Merci d'avance !
Dernière modification par Ezzmazz (Le 22/02/2019, à 12:00)
Hors ligne
#2 Le 22/02/2019, à 12:23
- pingouinux
Re : Extraire des lignes d'un .csv en fonction d'un motif
Bonjour,
Peux-tu montrer quelques lignes de ton fichier, certaines répondant au critère et d'autres non ?
Hors ligne
#3 Le 22/02/2019, à 12:32
- Ezzmazz
Re : Extraire des lignes d'un .csv en fonction d'un motif
Hors ligne
#4 Le 22/02/2019, à 12:43
- pingouinux
Re : Extraire des lignes d'un .csv en fonction d'un motif
Ce n'est pas un fichier texte que tu montres. Il faudrait un exemple avec plusieurs lignes, en les copiant-collant dans un terminal, pour pouvoir faire des tests.
Hors ligne
#5 Le 22/02/2019, à 14:04
- Ezzmazz
Re : Extraire des lignes d'un .csv en fonction d'un motif
Ah oui, pardon !
Voici un exemple de lignes quand je fais un cat Mon_fichier.csv:
Controller1,NA,ASHEBORO,ASH,B,,3674,4572,1814,3674,4572,1814,1859,#NAME?,0,124.45%,49.39%,19%,1,,"Big Risk, No Spare disk",45.04%,4.35%,12.63%,160,464,,,,,,0,1,1,1,0,410,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Controller2,EU,FR,URG,D,,0,0,0,0,0,0,0,#NAME?,0,#DIV/0!,#DIV/0!,#DIV/0!,1,,#N/A,0.00%,0.00%,#DIV/0!,NO STATS,-1088,,,,,,#N/A,#N/A,#N/A,#N/A,0,#N/A,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Controller3,EU,FR,URG,D,,0,0,0,0,0,0,0,#NAME?,0,#DIV/0!,#DIV/0!,#DIV/0!,1,,#N/A,0.00%,0.00%,#DIV/0!,NO STATS,-2159,,,,,,#N/A,#N/A,#N/A,#N/A,0,#N/A,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Controller4,NA,STARR,STA,D,,4430,6440,3736,4430,6440,3736,693,#NAME?,0,145.38%,84.35%,18%,1,,No more Data disk,65.17%,19.18%,-2.18%,849,-96,,,,,,0,2,1,2,2,547,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Il faudrait que je puisse extraire la ligne 1 et 4 au complet car ce sont les seules présentant une valeur supérieure à 4.00% dans la colonne W.
Dernière modification par Ezzmazz (Le 22/02/2019, à 15:01)
Hors ligne
#6 Le 22/02/2019, à 16:21
- credenhill
Re : Extraire des lignes d'un .csv en fonction d'un motif
hello
$ awk -F "%*," '$23 > 4' fichier.csv
Controller1,NA,ASHEBORO,ASH,B,,3674,4572,1814,3674,4572,1814,1859,#NAME?,0,124.45%,49.39%,19%,1,,"Big Risk, No Spare disk",45.04%,4.35%,12.63%,160,464,,,,,,0,1,1,1,0,410,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Controller4,NA,STARR,STA,D,,4430,6440,3736,4430,6440,3736,693,#NAME?,0,145.38%,84.35%,18%,1,,No more Data disk,65.17%,19.18%,-2.18%,849,-96,,,,,,0,2,1,2,2,547,65%,1.1,1.1,1.3,0.65,0.65,0.75,0.04,0.1,,,,,,,,,
Hors ligne
#7 Le 22/02/2019, à 17:42
- pingouinux
Re : Extraire des lignes d'un .csv en fonction d'un motif
Voici une méthode plus compliquée, mais qui fait le tri des valeurs :
awk -F"%*," '{if($23>4)t[$23]=$0}END{asorti(t,d,PROCINFO["sorted_in"]="@ind_num_desc");for(i in t)print t[i]}' Mon_fichier.csv
Hors ligne
#8 Le 22/02/2019, à 19:59
- Watael
Re : Extraire des lignes d'un .csv en fonction d'un motif
pourquoi utiliser asorti() si tu peux utiliser PROCINFO["sorted_in"] ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 22/02/2019, à 20:08
- pingouinux
Re : Extraire des lignes d'un .csv en fonction d'un motif
@Watael #8 :
Tu suggères sans doute ceci, que je ne connaissais pas. Merci pour le tuyau.
awk -F"%*," '{if($23>4)t[$23]=$0}END{PROCINFO["sorted_in"]="@ind_num_desc";for(i in t)print t[i]}' Mon_fichier.csv
Hors ligne