SCRIPT SHELL: Correction de code

Bonjour,

J’ai une betise dans mon code. Pouvez vous m’aider a le corriger?

je cherche à créer un fichier en récupérant le nom dans un autre fichier qui contient une liste.

[code]csv_DirectoryLocation=$(pwd)

echo -n "Le fichier liste des groupes se trouve-t-il dans le répertoire suivant? \n $csv_DirectoryLocation : [Oui] ou [Non]"
read answer_fg
#Chargement du chemin d’acces au fichier CSV dans la variable “csv_location”. Le fichier CSV doit s’appeler “import_regie.csv” => Si non, fonctionne pas.
case $answer_fg in
Oui|OUI|oui|O|o ) fichier_groupe=$csv_DirectoryLocation/fichier_groupe.csv
echo “Le fichier se trouve dans: $fichier_groupe”;;
Non|NON|non|N|n ) echo -n "Dans quel répertoire se trouve le fichier fichier_groupe.csv?\n"
read csv_EntryLocation
fichier_groupe=$csv_EntryLocation/fichier_groupe.csv
echo “Le fichier se trouve donc bien dans: $fichier_groupe\n”;;
*) "Au revoir…\n"
exit 1 ;;
esac
echo $csv_DirectoryLocation
nbr_ligne_groupe=awk 'END {print NR}' $fichier_groupe)
groupe=awk -F ";" -v num_ligne=$nbr_ligne_groupe 'NR == num_ligne { printf $NF }' $fichier_groupe
echo $groupe
echo $csv_DirectoryLocation
fichier_destination=$csv_DirectoryLocation/$groupe & ".csv"
echo $fichier_destination
touch $fichier_destination[/code]

Bon je sais le code est horrible mais je fais ce que je peux avec le peu de connaissance que j’ai. Le code va évoluer car j’ai en fait besoin de créer autant de fichier que de ligne lu dans "fichier_groupe.csv"
je ferai ça avec une boucle while.
Donc pour l’instant je veux juste régler mon problème de création de fichier sachant qu’en faisant comme ça, le fichier créer est un fichier dont le nom contient un retour chariot (retour à la ligne).
Je veux que mon fichier soit du type: nom_lu.csv

Merci pour votre aide.

Au fait, j’en profite pour demander si quelqu’un connait un bon bouquin pour apprendre le script shell?

je ne répondrai que pour la partie livres/tuto :

ftp://ftp-developpez.com/eric-sanchis/IntroProgBash.pdf

blaess.fr/christophe/livres/ … x-et-unix/

readarray -t array < nom_de_fichier.txt len=${#array[@]}; for ((i=0; i<${len};i++)); do mkdir ${array[$i]} done

salut,

dans ton code, seule la dernière ligne est lue :nbr_ligne_groupe=`awk 'END {print NR}' $fichier_groupe)`

de plus, plus haut dans le script, si l’utilisateur répond “non”, le nom de la variable fournie doit rester le même : csv_DirectoryLocation

enfin, entre autres, `fichier_destination=$csv_DirectoryLocation/$groupe & “.csv”’ ceci n’est pas correct, et devrait afficher une erreur : les " & " sont de trop.

Bonjour,
Je reviens un peu tardivement.

Je voudrai savoir ce qui cloche dans mon code???

[code]csv_DirectoryLocation=$(pwd)

echo -n "Le fichier liste des groupes se trouve-t-il dans le répertoire suivant? \n $csv_DirectoryLocation : [Oui] ou [Non]"
read answer_fg
#Chargement du chemin d’acces au fichier CSV dans la variable “csv_location”. Le fichier CSV doit s’appeler “fichier_groupe.csv” => Si non, fonctionne pas.
case $answer_fg in
Oui|OUI|oui|O|o ) fichier_groupe=$csv_DirectoryLocation/fichier_groupe.csv
echo “1. Le fichier se trouve dans: $fichier_groupe”;;
Non|NON|non|N|n ) echo -n "Dans quel répertoire se trouve le fichier fichier_groupe.csv?\n"
read csv_EntryLocation
fichier_groupe=$csv_EntryLocation/fichier_groupe.csv
echo “Le fichier se trouve donc bien dans: $fichier_groupe\n”;;
*) "Au revoir…\n"
exit 1 ;;
esac
echo "2. $csv_DirectoryLocation"
nbr_ligne_groupe=awk 'END {print NR}' $fichier_groupe
echo "3. $nbr_ligne_groupe"
groupe=awk -F ";" -v num_ligne=$nbr_ligne_groupe 'NR == num_ligne { print $NF }' $fichier_groupe
echo "4. $groupe"
echo “5. $csv_DirectoryLocation"
fichier_destination=”$csv_DirectoryLocation/$groupe.csv"
echo $fichier_destination
touch $fichier_destination[/code]

Voici le résultat une fois lancé.

[code]~/Documents$ ./tiers_csv.sh
Le fichier liste des groupes se trouve-t-il dans le répertoire suivant? \n /home/user/Documents : [Oui] ou [Non]o

  1. Le fichier se trouve dans: /home/user/Documents/fichier_groupe.csv
  2. /home/user/Documents
  3. 59
  4. 2014_utilisateurs_89
  5. /home/user/Documents
    .csve/user/Documents/2014_utilisateurs_89
    [/code]
    Ce qui m’intéresse dans la correction est la correction de la ligne apres le "5. /home/user/Documents"
    Je veux que cette ligne soit comme ca: “home/user/Documents/2014_utilisateurs_89.csv”

Quand je fait un ls -l, j’obtiens:

:~/Documents$ ls -l total 72540 -rw-r--r-- 1 user user 0 nov. 25 17:25 2014_utilisateurs_90?.csv
Je ne sais pas pourquoi il y a un caractère spéciale entre le “90” et “.csv”???

Merci pour l’aide?

voici le fichier fichier_groupe.csv:

Code département;Nom du département;nombres utilisateurs;Liste des groupes 01;Ain;1 499;2014_utilisateurs_01 02;Aisne;1 455;2014_utilisateurs_02 03;Allier;777;2014_utilisateurs_03 04;Alpes-de-Haute-Provence;442;2014_utilisateurs_04 05;Hautes-Alpes;368;2014_utilisateurs_05 06;Alpes-Maritimes;1 181;2014_utilisateurs_06 07;Ardèche;821;2014_utilisateurs_07 08;Ardennes;894;2014_utilisateurs_08 09;Ariège;535;2014_utilisateurs_09 10;Aube;820;2014_utilisateurs_10 11;Aude;992;2014_utilisateurs_11 12;Aveyron;684;2014_utilisateurs_12 13;Bouches-du-Rhône;2 674;2014_utilisateurs_13 14;Calvados;1 737;2014_utilisateurs_14 15;Cantal;464;2014_utilisateurs_15 16;Charente;990;2014_utilisateurs_16 17;Charente-Maritime;1 555;2014_utilisateurs_17 18;Cher;769;2014_utilisateurs_18 19;Corrèze;628;2014_utilisateurs_19 2A;Corse-du-Sud;335;2014_utilisateurs_2A 2B;Haute-Corse;540;2014_utilisateurs_2B 21;Côte-d'Or;1 353;2014_utilisateurs_21 22;Côtes-d'Armor;1 422;2014_utilisateurs_22 23;Creuse;431;2014_utilisateurs_23 24;Dordogne;1 178;2014_utilisateurs_24 25;Doubs;1 400;2014_utilisateurs_25 26;Drôme;1 166;2014_utilisateurs_26 27;Eure;1 590;2014_utilisateurs_27 28;Eure-et-Loir;987;2014_utilisateurs_28 29;Finistère;1 830;2014_utilisateurs_29 30;Gard;1 593;2014_utilisateurs_30 31;Haute-Garonne;2 300;2014_utilisateurs_31 32;Gers;702;2014_utilisateurs_32 33;Gironde;2 428;2014_utilisateurs_33 34;Hérault;2 011;2014_utilisateurs_34 35;Ille-et-Vilaine;1 959;2014_utilisateurs_35 36;Indre;629;2014_utilisateurs_36 67;Bas-Rhin;2 259;2014_utilisateurs_67 68;Haut-Rhin;1 580;2014_utilisateurs_68 69;Rhône;2 667;2014_utilisateurs_69 70;Haute-Saône;861;2014_utilisateurs_70 71;Saône-et-Loire;1 488;2014_utilisateurs_71 72;Sarthe;1 358;2014_utilisateurs_72 73;Savoie;1 012;2014_utilisateurs_73 74;Haute-Savoie;1 480;2014_utilisateurs_74 76;Seine-Maritime;2 328;2014_utilisateurs_76 79;Deux-Sèvres;932;2014_utilisateurs_79 80;Somme;1 636;2014_utilisateurs_80 81;Tarn;842;2014_utilisateurs_81 82;Tarn-et-Garonne;490;2014_utilisateurs_82 83;Var;1 440;2014_utilisateurs_83 84;Vaucluse;685;2014_utilisateurs_84 85;Vendée;1 418;2014_utilisateurs_85 86;Vienne;1 095;2014_utilisateurs_86 87;Haute-Vienne;856;2014_utilisateurs_87 88;Vosges;1 151;2014_utilisateurs_88 89;Yonne;973;2014_utilisateurs_89 90;Territoire de Belfort;353;2014_utilisateurs_90

le fichier csv est importé de Windows ? alors il faut le passer par fromdos'cat -A tonFichier.csv’ nous dira ce qu’il y a en guise de fins de lignes.

[quote=“vandman”]…Ce qui m’intéresse dans la correction est la correction de la ligne apres le “5. /home/user/Documents”…[/quote]Essaie ces lignes de commandes dans un terminal :csv_DirectoryLocation="/home/user/Documents" echo $csv_DirectoryLocationcsv_DirectoryLocation="/home/user/Documents" csv_DirectoryLocation=${csv_DirectoryLocation#/} echo $csv_DirectoryLocation

NOTE: S’il n’existe pas, il te faudra créer le répertoire contenant avant de pouvoir y créer des fichiers avec [mono]touch[/mono] (ou autre)

Par exemple, si le répertoire [mono]home/user/Documents[/mono] n’existe pas, la commande [mono]touch home/user/Documents/fichTest[/mono] retournera :

Il faudra d’abord créer le répertoire contenant : [mono]home/user/Documents/[/mono] avec la commande :mkdir -p home/user/Documents/

Bonsoir,

Je réponds rapidement à MicP.

Le problème n’est pas la création du répertoire, mais le fait que j’ai

au lieu de

Désolé, je n’ai pas été assez précis?

Cordialement
vandman

=======[quote]…Je ne sais pas pourquoi il y a un caractère spéciale entre le “90” et “.csv”???…[/quote]Histoire de savoir de quel code de caractère il s’agit, essaie de voir avec [mono]hexdump[/mono]

michel@debG53SW:~$ sed -n '/^90/p' fichier_groupe.csv | hexdump -C 00000000 39 30 3b 54 65 72 72 69 74 6f 69 72 65 20 64 65 |90;Territoire de| 00000010 20 42 65 6c 66 6f 72 74 3b 33 35 33 3b 32 30 31 | Belfort;353;201| 00000020 34 5f 75 74 69 6c 69 73 61 74 65 75 72 73 5f 39 |4_utilisateurs_9| 00000030 30 0a |0.| 00000032 michel@debG53SW:~$ michel@debG53SW:~$ ls -l 2014_utilisateurs_90* | hexdump -C 00000000 2d 72 77 2d 72 2d 2d 72 2d 2d 20 31 20 6d 69 63 |-rw-r--r-- 1 mic| 00000010 68 65 6c 20 6d 69 63 68 65 6c 20 30 20 6e 6f 76 |hel michel 0 nov| 00000020 2e 20 20 32 38 20 30 32 3a 31 36 20 32 30 31 34 |. 28 02:16 2014| 00000030 5f 75 74 69 6c 69 73 61 74 65 75 72 73 5f 39 30 |_utilisateurs_90| 00000040 2e 63 73 76 0a |.csv.| 00000045 michel@debG53SW:~$ Si ça se trouve, c’est ce caractère qui met la pagaille dans le script, mais au cas où, remplace les lignes:fichier_destination="$csv_DirectoryLocation/$groupe.csv" echo $fichier_destination touch $fichier_destination parfichier_destination=${csv_DirectoryLocation}/${groupe}".csv" echo "$fichier_destination" touch "$fichier_destination"

=======

[quote=“vandman”]…Désolé, je n’ai pas été assez précis?…[/quote]Ça me rassure : je ne suis donc pas le seul… :slightly_smiling:

=======
J’ai enlevé une étoile en trop dans mon message précédent : [mono]${csv_DirectoryLocation#/}[/mono] au lieu de [mono][strike]${csv_DirectoryLocation#/*}[/strike][/mono]

bonjour,

oui, le fichier est importé de Windows.

Voici les retours des codes suivants:

cat -A fichier_groupe.csv Code dM-CM-)partement;Nom du dM-CM-)partement;nombres utilisateurs;Liste des groupes^M$ 01;Ain;1M-BM- 499;2014_utilisateurs_01^M$ 02;Aisne;1M-BM- 455;2014_utilisateurs_02^M$
et

~/Documents$ sed -n '/^90/p' fichier_groupe.csv | hexdump -C 00000000 39 30 3b 54 65 72 72 69 74 6f 69 72 65 20 64 65 |90;Territoire de| 00000010 20 42 65 6c 66 6f 72 74 3b 33 35 33 3b 32 30 31 | Belfort;353;201| 00000020 34 5f 75 74 69 6c 69 73 61 74 65 75 72 73 5f 39 |4_utilisateurs_9| 00000030 30 0d 0a |0..| 00000033
et

~/Documents$ ls -l 2014_utilisateurs_90* | hexdump -C 00000000 2d 72 77 2d 72 2d 2d 72 2d 2d 20 31 20 70 69 65 |-rw-r--r-- 1 pie| 00000010 72 72 65 20 70 69 65 72 72 65 20 30 20 64 c3 a9 |rre pierre 0 d..| 00000020 63 2e 20 20 20 31 20 30 39 3a 30 39 20 32 30 31 |c. 1 09:09 201| 00000030 34 5f 75 74 69 6c 69 73 61 74 65 75 72 73 5f 39 |4_utilisateurs_9| 00000040 30 0d 2e 63 73 76 0a |0..csv.| 00000047

Bonjour,
la modification suivante:

fichier_destination=${csv_DirectoryLocation}/${groupe}".csv" echo "$fichier_destination" touch "$fichier_destination"
me retourne l’erreur suivante:

[code]~/Documents$ ./tiers_csv.shLe fichier liste des groupes se trouve-t-il dans le répertoire suivant? \n /home/pierre/Documents : [Oui] ou [Non]o

  1. Le fichier se trouve dans: /home/pierre/Documents/fichier_groupe.csv
  2. /home/pierre/Documents
  3. 59
  4. 2014_utilisateurs_90
  5. /home/pierre/Documents
    ./tiers_csv.sh: ligne22: ${$csv_DirectoryLocation}/${groupe}".csv" : mauvaise substitution
    [/code]

[quote]oui, le fichier est importé de Windows.[/quote]alors fromdos tonFichier.csv!

Bonjour,

La commande fromdos fonctionne bien, elle supprime bien les retours à la ligne Windows.

Merci

[code]awk '{sub(/\r$/,"");print}' dosfile.txt > unixfile.txt[/code]
[code]awk '{sub(/$/,"\r");print}' unixfile.txt > dosfile.txt[/code]