Pages : 1
#1 Le 29/11/2013, à 15:31
- capitainabloc
utilisation sh
bonjour à tous,
je suis novice, et j'essaie de créer un fichier en sh de ce type:
#!/bin/sh
while read line
do
# si la ligne fait 36 caractères de long ET que le 6ème caractère est un espace
if [ ${#line} -ne 36 ] && [ "$(echo "$line" | cut -c6)" = ' ' ]
then
# alors appliquer toutes les modification qui suivent sur la ligne
echo "$line" | sed 's/^.........../&./'
echo "$line" | sed 's/^............./& /'
echo "$line" | sed 's/^................../&./'
echo "$line" | sed 's/^.................../& /'
echo "$line" | sed 's/^..................../&./'
echo "$line" | sed 's/^......................./& /'
echo "$line" | sed 's/^............................/&./'
echo "$line" | sed 's/^............................./& /'
echo "$line" | sed 's/^.................................../&./'
fi
done < yo.txt
mais ca ne focctionne pas, je pense que mon erreur vient de la suite de ligne après le then, mais je ne sais pas comment formater cette suite de commande
Hors ligne
#2 Le 29/11/2013, à 15:58
- capitainabloc
Re : utilisation sh
ok, j'ai trouvé, donc voici le code corrigé:
#!/bin/sh
while read line
do
if [ ${#line} -ne 36 ] && [ "$(echo "$line" | cut -c6)" = ' ' ]
then
#le séparateur | est utilisé entre chaque argument; la forme des sed a été simplifiée aussi, de plus il faut incrémenter le nombre de caractères à prendre en compte pour chaque sed, en prenant en compte de sed précédent. (c'est pas très clair dit comme ca!!)
echo "$line" | sed 's/^.\{11\}/&./' | sed 's/^.\{13\}/& /' | sed 's/^.\{20\}/&./' | sed 's/^.\{22\}/& /' | sed 's/^.\{24\}/&./' | sed 's/^.\{28\}/& /' | sed 's/^.\{34\}/&./' | ...
else
echo "$line"
fi
done < yo.txt
Hors ligne
#3 Le 29/11/2013, à 17:34
- capitainabloc
Re : utilisation sh
une autre question:
je souhaite comparer les 6 premiers caracteres d'une ligne avec les 6 premiers de la ligne suivante afin d'effectuer une opération:
10.500 65131196261326392457522
11.000 65131196261326392457522
11.500 65131196261326392457522
12.000 65131196261326392457522
12.500 65131196261326392457522
je sais extraire les 6 1ers caractere de chaque ligne une à une avec
cut -c-6
.
mais, comment extraire 11.000 et le soustaire à 10.500, et ca pour chaque ligne du fichier?
Dernière modification par capitainabloc (Le 29/11/2013, à 17:35)
Hors ligne
#4 Le 29/11/2013, à 18:31
- pingouinux
Re : utilisation sh
Bonsoir,
v1=0; cut -d\ -f1 ton_fichier | while read v2; do echo $v1 $v2 $(echo $v2 - $v1|bc -l); v1=$v2; done
Ce qui donne avec ton exemple
0 10.500 10.500
10.500 11.000 .500
11.000 11.500 .500
11.500 12.000 .500
12.000 12.500 .500
ou bien
v1=0; cut -c1-6 ton_fichier | while read v2; do echo $v1 $v2 $(echo $v2 - $v1|bc -l); v1=$v2; done
Ou alors en bash
v1=0; while read v2; do echo $v1 $v2 $(bc -l <<<"$v2 - $v1"); v1=$v2; done < <(cut -c-6 ton_fichier)
Dernière modification par pingouinux (Le 29/11/2013, à 18:35)
Hors ligne
#5 Le 29/11/2013, à 18:57
- pingouinux
Re : utilisation sh
Pour ta première question, en #2, tu ne traites en fait que les lignes de longueur différente de 36 (test inversé ?).
de plus il faut incrémenter le nombre de caractères à prendre en compte pour chaque sed, en prenant en compte de sed précédent
Ce n'est pas nécessaire si tu inverses l'ordre des sed, en commençant par la fin de la ligne.
Sinon, tu peux tout faire en une seule commande :
sed -r 's/^(.{5} .{5})(.{1})(.{6})(.{1})(.{1})(.{3})(.{5})(.{8})$/\1.\2 \3.\4 \5.\6 \7.\8/' yo.txt
Édité : Réponse complétée
Dernière modification par pingouinux (Le 30/11/2013, à 08:40)
Hors ligne
#6 Le 30/11/2013, à 10:06
- capitainabloc
Re : utilisation sh
oui, bien vu Pingouinux!
j'ai encore du taf avant de parler couramment le bash!
Hors ligne
Pages : 1