Formule shell préfixe

Résolu/Fermé
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 - Modifié par zipe31 le 17/04/2014 à 15:55
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 - 18 avril 2014 à 12:52
Je relance un nouveau sujet qui est similaire à ma première question mais j'apporte un peu plus de précision.

Je reçois un fichier en format csv (emploi_fixe) sur mon serveur contenant x colonnes. Sachant que la première colonne (ID) contient un chiffre compris entre 1 et 192000 et qu'il n'y a aucune en-tête sur mon fichier.

Je cherche à créer une formule en shell (.sh) qui puisse me permettre d'ajouter la lettre "S" avant mon ID après la ligne 192000. Autrement dit je voudrais quand je reçois le fichier csv avec la ligne :

"192001";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";

j'ai un autre fichier qui se créé (qui porterais le même nom) avec cette nuance :

"S192001";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";

Ceci ne marche pas :

while IFS=';' read -r -k1 ID 
do emploi_fixe ${ID//\"/} -gt 192000 && s=S || s=""
echo "\"$s$ID\";$ID"
done < emploi_fixe.prn

Auriez-vous une idée ??

Merci d'avance pour votre aide
A voir également:

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
17 avril 2014 à 16:09
Salut,

Il suffit d'adapter la syntaxe de dubcek donnée dans ton précédent post :

awk  'BEGIN{FS=OFS="\""} $2 <= 192000 { print } $2 > 192000 { $2="S"$2 ; print }' fichier > fichier_final
0
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
17 avril 2014 à 16:15
Donc si je comprends bien j'ajoute. Par contre mon séparateur est un point virgule ça ne devrait pas être ça ?

awk  'BEGIN{FS=OFS=";""} $2 <= 192000 { print } $2 > 192000 { $2="S"$2 ; print }' emploi_fixe.full.prn > emploi_fixe.prn
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
17 avril 2014 à 16:20
Ben non, ici ton séparateur c'est le guillemet, du moins pour plus de facilité avec la commande awk :

$ cat fich 
"191001";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";
"191999";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";
"192000";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";
"192001";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";
"192081";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";
"192501";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";

$ awk 'BEGIN{FS=OFS="\""} $2 <= 192000 { print } $2 > 192000 { $2="S"$2 ; print }' fich
"191001";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";
"191999";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";
"192000";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";
"S192001";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";
"S192081";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";
"S192501";"01/01/1900";" ";"01/02/1900";"404250";"00";"0";"FESD";"AMF";" ";"65";"99";"P999";" ";"1";"SV";"07";" ";"45.0";"184465";"N";"999";
0
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
17 avril 2014 à 16:40
Et dernière petite question :

Est-ce que je peux faire quelque chose comme ça ? :
cat emploi_fixe.full.prn | sort -u | sort -t\;  -k1,1 -k2.8,2.11 -k2.5,2.6 -k2.2,2.3 ; awk  'BEGIN{FS=OFS="\""} $2 <= 192000 { print } $2 > 192000 { $2="S"$2 ; print }'> emploi_fixe.prn

Et idéalement je peux remplacer 192000 par une variable ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
17 avril 2014 à 16:49
Est-ce que je peux faire quelque chose comme ça ? :
Oui, à condition de ne pas oublier de mettre un pipe avant le awk (et non un point virgule comme c'est le cas dans ton exemple) ;-(

Et idéalement je peux remplacer 192000 par une variable ?
Oui. Mais il faut déclarer ta variable dans awk :

awk -v VAR=192000 'BEGIN{FS=OFS="\""} $2 <= VAR...
Ou
-v VAR=${var_shell}
si ta variable est déjà déclarée dans un script.
0
Benoit A. Messages postés 454 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 13 août 2015 515
17 avril 2014 à 16:53
Super merci beaucoup je teste tout ça !
0
ce sujet est un doublon de celui-ci, où j'ai dit que
-K1
n'est pas un nom de variable valide, et ce que je pense du «ça marche pas».
0