Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/11/2013, à 16: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, à 16: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, à 18: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, à 18:35)

Hors ligne

#4 Le 29/11/2013, à 19: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, à 19:35)

Hors ligne

#5 Le 29/11/2013, à 19: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é ?).

capitaineabloc #2 a écrit :
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, à 09:40)

Hors ligne

#6 Le 30/11/2013, à 11:06

capitainabloc

Re : utilisation sh

oui, bien vu Pingouinux!  smile
j'ai encore du taf avant de parler couramment le bash!

Hors ligne