A voir également:
- Calculer le nombre d'occurence en bash
- Calculer une moyenne sur excel - Guide
- List bash ✓ - Forum Shell
- En raison d'un nombre important d'échec de connexion snapchat - Forum Snapchat
- Rolland souhaite calculer le montant total des ventes de son magasin. le fichier contient, pour chaque produit, la quantité vendue et le prix unitaire. calculez le montant total des ventes. ✓ - Forum Excel
- Dans ce fichier, réalisez le graphique xy (nuage de points ou dispersion), avec les x en abscisse. dans le graphique, les points dessinent un nombre. lequel ? - Forum Bureautique
3 réponses
dubcek
Messages postés
18718
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 mars 2024
5 615
17 juin 2010 à 12:45
17 juin 2010 à 12:45
hello
$ awk 'BEGIN{FS=OFS=";"};{if(n<NF)n=NF;f[NR]=$0};END{for(i=1;i<=NR;i++){$0=f[i];m=NF;while(m++<n)$NF=OFS $NF ; print}}' fichier "09.03.10";"18:31:53";23,01;0,21;167,2;1016,9;2 ;17 ;-3,4 ;2,9 "09.03.10";"18:31:54";23,01;0,21;167,1;1016,9;2, ;17 ;-3,4 ;2,9 "09.03.10";"18:31:55";23,01;0,21;167,2;1016,9;2, ;17 ;-3,4;2,9 "09.03.10";"18:31:56";23,01;0,22;167,2;1016,8;2, ;17 ;-3,4;2,9 "09.03.10";"22:50:55";;;;;;;;23, "09.03.10";"22:50:56";;;;;;;;23, "09.03.10";"22:50:57";;;;;;;;23, "09.03.10";"22:50:58";;;;;;;;23, "09.03.10";"22:50:59";;;;;;;;23, $
dubcek
Messages postés
18718
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 mars 2024
5 615
17 juin 2010 à 14:48
17 juin 2010 à 14:48
on pourrait faire en bash, mais là j'utilise awk
BEGIN{FS=OFS=";"} on definit ; comme séparateur de champ
{if(n<NF)n=NF;f[NR]=$0} on sauve dans n la plus grande valeur de NF (qui est le nombre de champ par ligne) et on stocke chaque ligne dans un tableau f, NR est le numéro de ligne. Il faut lire tout le fichier pour trouver le plus grand NF
END{for(i=1;i<=NR;i++) après la fin de la lecture du fichier (END), on traite le tableau qui contient chaque ligne, NR est le nombre de lignes
{$0=f[i];m=NF;while(m++<n)$NF=OFS $NF ; print}} tant que le nombre de champ d'une ligne (NF) est plus petit que n (le nombre de champs le plus grand), on concatène un ; avant le dernier champ puis on imprime la ligne; print sans paramètre = print $0
BEGIN{FS=OFS=";"} on definit ; comme séparateur de champ
{if(n<NF)n=NF;f[NR]=$0} on sauve dans n la plus grande valeur de NF (qui est le nombre de champ par ligne) et on stocke chaque ligne dans un tableau f, NR est le numéro de ligne. Il faut lire tout le fichier pour trouver le plus grand NF
END{for(i=1;i<=NR;i++) après la fin de la lecture du fichier (END), on traite le tableau qui contient chaque ligne, NR est le nombre de lignes
{$0=f[i];m=NF;while(m++<n)$NF=OFS $NF ; print}} tant que le nombre de champ d'une ligne (NF) est plus petit que n (le nombre de champs le plus grand), on concatène un ; avant le dernier champ puis on imprime la ligne; print sans paramètre = print $0
dubcek
Messages postés
18718
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
22 mars 2024
5 615
Modifié par dubcek le 17/06/2010 à 15:40
Modifié par dubcek le 17/06/2010 à 15:40
remplacer $NF=OFS $NF par $2=$2 OFS
Merci beaucoup! Je vais vous embeter une dernière fois :-S, j'ai un fichier comme cela:
"";
"TempAmb";"Anemometre";"Girouette";"PresAtm";"PSolaire";"Hu";"TempRosee";"Eau/Air";
"NiCr";
"Ntc";"D260";"D260";"D2.6";"D2.6";"%rH";"HDT";"HAH";
"M00:øC";
"M00:øC";"M01:ms";"M02:ø";"M03:mb";"M04:Wm";"M10:%H";"M20:øC";"M30:gk";
;
;
;
;
0,;;
et un fichier comme cela:
"2590-9";"COMMENT:"
"ALMEMO";"RANGE:"
"DATE:";"TIME:"
"MODUL:00";"LIM-MIN:"
"NUMBER:";"00-000"
"V5";"LIM-MAX:"
J'aimerais que ça fasse cela:
"2590-9";"COMMENT:";"TempAmb";"Anemometre";"Girouette";"PresAtm";"PSolaire";"Hu";"TempRosee";"Eau/Air";"";
"ALMEMO";"RANGE:""Ntc";"D260";"D260";"D2.6";"D2.6";"%rH";"HDT";"HAH";"NiCr";
"DATE:";"TIME:";"M00:øC";"M01:ms";"M02:ø";"M03:mb";"M04:Wm";"M10:%H";"M20:øC";"M30:gk";"M31:øC";
"MODUL:00";"LIM-MIN:";
"NUMBER:";"00-000";
"V5";"LIM-MAX:";
Donc dans un premier temps que la ligne une du fichier 1 se mette à la fin de la ligne deux du fichier 1, ligne 3 à la fin de la ligne4... Tout cela dans un même fichier, et qu'ensuite qu'on colle le fichier 1 à coté du fichier 2, mais je ne sais pas comment le traduire en bash...
Merci de votre aide.
"";
"TempAmb";"Anemometre";"Girouette";"PresAtm";"PSolaire";"Hu";"TempRosee";"Eau/Air";
"NiCr";
"Ntc";"D260";"D260";"D2.6";"D2.6";"%rH";"HDT";"HAH";
"M00:øC";
"M00:øC";"M01:ms";"M02:ø";"M03:mb";"M04:Wm";"M10:%H";"M20:øC";"M30:gk";
;
;
;
;
0,;;
et un fichier comme cela:
"2590-9";"COMMENT:"
"ALMEMO";"RANGE:"
"DATE:";"TIME:"
"MODUL:00";"LIM-MIN:"
"NUMBER:";"00-000"
"V5";"LIM-MAX:"
J'aimerais que ça fasse cela:
"2590-9";"COMMENT:";"TempAmb";"Anemometre";"Girouette";"PresAtm";"PSolaire";"Hu";"TempRosee";"Eau/Air";"";
"ALMEMO";"RANGE:""Ntc";"D260";"D260";"D2.6";"D2.6";"%rH";"HDT";"HAH";"NiCr";
"DATE:";"TIME:";"M00:øC";"M01:ms";"M02:ø";"M03:mb";"M04:Wm";"M10:%H";"M20:øC";"M30:gk";"M31:øC";
"MODUL:00";"LIM-MIN:";
"NUMBER:";"00-000";
"V5";"LIM-MAX:";
Donc dans un premier temps que la ligne une du fichier 1 se mette à la fin de la ligne deux du fichier 1, ligne 3 à la fin de la ligne4... Tout cela dans un même fichier, et qu'ensuite qu'on colle le fichier 1 à coté du fichier 2, mais je ne sais pas comment le traduire en bash...
Merci de votre aide.
Utilisateur anonyme
Modifié par qqchquicommenceparQ le 17/06/2010 à 16:41
Modifié par qqchquicommenceparQ le 17/06/2010 à 16:41
awk et bash sont deux programmes différents.
bash est un interpréteur de commandes qui exécute les commandes lues depuis l'entrée standard ou depuis un fichier.
awk est un langage de recherche de motif et de traitement.
Sur des fichiers (très) volumineux, il vaut mieux utiliser awk, qui est plus rapide. Il est fait pour ça !
mais si tu veux apprendre bash :
bash est un interpréteur de commandes qui exécute les commandes lues depuis l'entrée standard ou depuis un fichier.
awk est un langage de recherche de motif et de traitement.
Sur des fichiers (très) volumineux, il vaut mieux utiliser awk, qui est plus rapide. Il est fait pour ça !
mais si tu veux apprendre bash :
#!/bin/bash fichier=./fichier while read line; do npunct="${line//[^;]/}" npunct="${#npunct}" if (( ! pnpunct || npunct > pnpunct )); then pnpunct="$npunct"; fi done <$fichier while IFS=';' read -a line; do npunct=$((${#line[@]} - 1)) if (( npunct < pnpunct )); then toadd=$(( pnpunct - npunct )) printf '%s;' "${line[@]::npunct}" for (( i=0; i < toadd; i++ )); do printf ";"; done printf '%s\n' "${line[@]: -1}" else line=$(printf '%s;' "${line[@]}") echo -ne "${line}\b \n" fi done <$fichier
17 juin 2010 à 13:28
17 juin 2010 à 13:33