[shell unix] fichier ligne par ligne
Résolu/Fermé
jebok
Messages postés
358
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
23 octobre 2007
-
29 juil. 2005 à 14:52
SinD - 7 févr. 2016 à 21:04
SinD - 7 févr. 2016 à 21:04
A voir également:
- Shell lire un fichier ligne par ligne
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Aller à la ligne excel - Guide
- Lire fichier epub - Guide
- Fichier rar - Guide
- Site de vente en ligne particulier - Guide
27 réponses
truky
Messages postés
45
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
23 mai 2007
34
Modifié le 8 juin 2009 à 17:36
Modifié le 8 juin 2009 à 17:36
Je sais que ca remonte a 2006 mais pour les prochains lecteurs
ben che pas si vous aimez le truc compliqué mais j'ai
tou simplement
bye
ben che pas si vous aimez le truc compliqué mais j'ai
while read a b c do echo "$a $b $c" done < fichier.txt
tou simplement
bye
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
22 nov. 2006 à 19:32
22 nov. 2006 à 19:32
Salut,
Essaie ça :
Essaie ça :
[jp@MDK tmpfs]$ cat fich.txt riri rara roro toto tata titi lili lala lolo [jp@MDK tmpfs]$ cat new.sh #!/bin/bash while read ligne do set $(echo $ligne) init_prenom=$(eval echo $1) prenom=$(eval echo $2) nom=$(eval echo $3) echo -e "variable1=$init_prenom\nvariable2=$prenom\nvariable3=$nom\n" done < fich.txt [jp@MDK tmpfs]$ sh new.sh variable1=riri variable2=rara variable3=roro variable1=toto variable2=tata variable3=titi variable1=lili variable2=lala variable3=lolo [jp@MDK tmpfs]$;-))
ça dépand du traitement mais si lire la ligne pour faire une action
cat FICHIER | while read ligne do .... .... #action .... .... done
kelux
Messages postés
3074
Date d'inscription
vendredi 18 juin 2004
Statut
Contributeur
Dernière intervention
20 janvier 2023
432
15 juil. 2006 à 18:11
15 juil. 2006 à 18:11
Encore quelques jours et c'était un an pile de retard !
Ah oui le mode asynchrone c'est gênant des fois...un an apres c'est pas mal quand meme :)
Ah oui le mode asynchrone c'est gênant des fois...un an apres c'est pas mal quand meme :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Voici un petit script que j'ai créé grâce à ce fil -décidemment- très utile.
Il prend une playlist et un repertoire en entrée et copie les fichiers de la playlist dans le repertoire. Tout ça parceque Rhythmbox ne le fait pas tout seul.
Il prend une playlist et un repertoire en entrée et copie les fichiers de la playlist dans le repertoire. Tout ça parceque Rhythmbox ne le fait pas tout seul.
#!/bin/sh if [ $# -eq 2 ] then FILE=$1 DIR=$2 else echo "$# arguments found, 2 expected." echo "Usage: m3ucp M3U_FILE DESTINATION_DIR" fi if [ -f $FILE ] then if [ -d $DIR ] then cat $FILE | while read ligne do cp "$ligne" "$DIR" echo "Copie de $ligne effectuee" done else echo "$DIR est introuvable" fi else echo "$FILE est introuvable" fi
hi hi hi excellent le retour de la réponse d'outre tombe un an plus tard :)
bon du coup ce petit re-up du post me convient bien parceque j'ai le même problème si ce n'est que le mien est un peu plus pointu
j'ai un fichier .csv suivant :
riri rara roro
toto tata titi
lili lala lolo
j'aimerai lire ligne par ligne ce fichier dans une boucle pour
au premier passage mettre
variable1=riri
variable2=rara
variable3=roro
2ème passage:
variable1=toto
variable2=tata
variable3=titi
etc...
j'ai reussi a créer la boucle qui va bien pour passer de ligne en ligne comme suit :
mais ma command awk semble ne pas fonctionner car elle ne me sort aucune valeur du fichier :(
si quelqu'un a une idée ??
merci d'avance
ps : je sais que mon script est tout pourri donc pas de remarque sur l'optimisation c'est juste un truc dont je suis censé me servir une fois pour remplir un annuaire ldap ... avec plein de titi toto lala lili bref je m'amuse :)
bon du coup ce petit re-up du post me convient bien parceque j'ai le même problème si ce n'est que le mien est un peu plus pointu
j'ai un fichier .csv suivant :
riri rara roro
toto tata titi
lili lala lolo
j'aimerai lire ligne par ligne ce fichier dans une boucle pour
au premier passage mettre
variable1=riri
variable2=rara
variable3=roro
2ème passage:
variable1=toto
variable2=tata
variable3=titi
etc...
j'ai reussi a créer la boucle qui va bien pour passer de ligne en ligne comme suit :
while read ligne do i=$i+1 echo $i # Définition des variables à partir du fichier list.csv #-F ";" awk '{print $1}' > init_prenom init_prenom=$(cat init_prenom) echo $init_prenom awk '{print $2}' > prenom prenom=$(cat prenom) echo $prenom awk '{print $3}' > nom nom=$(cat nom) echo $nom done < $fichier done
mais ma command awk semble ne pas fonctionner car elle ne me sort aucune valeur du fichier :(
si quelqu'un a une idée ??
merci d'avance
ps : je sais que mon script est tout pourri donc pas de remarque sur l'optimisation c'est juste un truc dont je suis censé me servir une fois pour remplir un annuaire ldap ... avec plein de titi toto lala lili bref je m'amuse :)
OUuuaaaaAAAa
C'est génial çà marche super au poil :) :)
merci vraiment merci
je suis pas un développeur ( nooonnn sans déconner :) ) et j'ai passer toute l'aprem d'hier a essayer de me dépatouiller avec awk sans résultat
encore merci de ton aide
@Bientot
C'est génial çà marche super au poil :) :)
merci vraiment merci
je suis pas un développeur ( nooonnn sans déconner :) ) et j'ai passer toute l'aprem d'hier a essayer de me dépatouiller avec awk sans résultat
encore merci de ton aide
@Bientot
Le sujet date de plus de deux ans maintenant, la reponse de celui qui l'a initié a été un an plus tard, pourtant moi au jour d'aujourd'hui en 2007 ça me sert ce sujet, et null doute que des personnes qui auront besoin de ce sujet seront enthousiasmées de trouver cette solution, des années aprés et pourquoi pas des décennies aprés, vue qu'Internet est devenu le seul outil immortel que l'homme ait inventé.
Je tiens quand même a remercier les personnes qui ont initiées ce sujet, et celles et ceux qui ont apportées leurs contributions.
Bien à vous.
Je tiens quand même a remercier les personnes qui ont initiées ce sujet, et celles et ceux qui ont apportées leurs contributions.
Bien à vous.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
20 sept. 2007 à 12:29
20 sept. 2007 à 12:29
Et ça va servir encore l'année prochaine, et ainsi de suite..... :-))
Petrio42
Messages postés
11
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
23 février 2008
30 nov. 2007 à 15:36
30 nov. 2007 à 15:36
bonjour,
Dans un dossier se trouver des fichiers. J'aimerais trouver une commande en shell qui me permetterer de supprimer les fichier qui date de plus de deux jour(Pour savoir je vais comparer la date de creation du fichier depuis 1970 et le jour que nous somme depuis 1970). Comme le nombre de fichier dans le dossier est variable (car il s'agit du dossier recuperant les fichier uploader) je pense faire une boucle mais je sai pas du tout comment faire quelqu'un pourait-il m'aider.
Voila se que j'ai commencer a faire
#!/bin/sh
datecre=`stat -c $Y /var/www/html/upload/files/* #met en variable le nombre de seconde du fichier depuis 1970`
nbdefichier=`find /var/www/html/upload/files/ -type f | wc -l`#donne le nombre de fichier dans le dossier
seconde1970=`date +%s` #met le nombre de seconde en variable depuis 1970
((jour1970=$seconde1970/86400)) #on converti les sec en heur
((jourfichier=$datecre/86400)) #on fait pareil pour les fichiers dans le dossier
echo "nous avons $nbdefichier dans le dossier"
echo "Date de creation des fichiers dans le dossier = $jourfichier"
echo "Jour depuis 1970 = $jour1970"
Voila se que j'ai commencer a faire tout cela marche bien quant il n'y a qu'un seul ficiher il me donne bien sa date en jour depuis 1970 mais des que j'en rajoute plus rien ne marche je pense mettre une boucle mais je ne sais pas comment faire .
Merci d'avance
Dans un dossier se trouver des fichiers. J'aimerais trouver une commande en shell qui me permetterer de supprimer les fichier qui date de plus de deux jour(Pour savoir je vais comparer la date de creation du fichier depuis 1970 et le jour que nous somme depuis 1970). Comme le nombre de fichier dans le dossier est variable (car il s'agit du dossier recuperant les fichier uploader) je pense faire une boucle mais je sai pas du tout comment faire quelqu'un pourait-il m'aider.
Voila se que j'ai commencer a faire
#!/bin/sh
datecre=`stat -c $Y /var/www/html/upload/files/* #met en variable le nombre de seconde du fichier depuis 1970`
nbdefichier=`find /var/www/html/upload/files/ -type f | wc -l`#donne le nombre de fichier dans le dossier
seconde1970=`date +%s` #met le nombre de seconde en variable depuis 1970
((jour1970=$seconde1970/86400)) #on converti les sec en heur
((jourfichier=$datecre/86400)) #on fait pareil pour les fichiers dans le dossier
echo "nous avons $nbdefichier dans le dossier"
echo "Date de creation des fichiers dans le dossier = $jourfichier"
echo "Jour depuis 1970 = $jour1970"
Voila se que j'ai commencer a faire tout cela marche bien quant il n'y a qu'un seul ficiher il me donne bien sa date en jour depuis 1970 mais des que j'en rajoute plus rien ne marche je pense mettre une boucle mais je ne sais pas comment faire .
Merci d'avance
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
30 nov. 2007 à 15:40
30 nov. 2007 à 15:40
Petrio42
Messages postés
11
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
23 février 2008
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
30 nov. 2007 à 15:47
30 nov. 2007 à 15:47
merci pour cette reponse rapide je vais regarder un peu tout sa
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
30 nov. 2007 à 15:51
30 nov. 2007 à 15:51
la commande find fait la boucle toute seule
find . -type f -ctime +2 -print
ajouter, pour supprimer les fichiers:
-exec rm {} \;
sinon une boucle en sh:
for N in liste_de_fichier
do
...
done
find . -type f -ctime +2 -print
ajouter, pour supprimer les fichiers:
-exec rm {} \;
sinon une boucle en sh:
for N in liste_de_fichier
do
...
done
Bonjour
Ce cas est un peu différent...
J'ai un répertoire dans lequel je peux avoir jusqu'à 10 000 fichiers dont les noms se ressemblent
F09782467
F09548942
F09452118
...
Je voudrais récupérer le nom de chaque fichiers 1 à 1 dans une variable pour en faire un traitement.
num=`ls |wc -w` #je compte le nb de fichiers
for i in num
do
#récupérer le 1er fichier du répertoire
php -q $fich (...)
rm -f $fich
done
Ce cas est un peu différent...
J'ai un répertoire dans lequel je peux avoir jusqu'à 10 000 fichiers dont les noms se ressemblent
F09782467
F09548942
F09452118
...
Je voudrais récupérer le nom de chaque fichiers 1 à 1 dans une variable pour en faire un traitement.
num=`ls |wc -w` #je compte le nb de fichiers
for i in num
do
#récupérer le 1er fichier du répertoire
php -q $fich (...)
rm -f $fich
done
Bonjour
Voila je veux lire le fichier printed.log ligne par ligne et récuperer une valeur sur une autres serveur par un rsh ( pas de ssh sur cette machine).
Cela ne fonctionne que pour la premiere ligne.
Si je retire la ligne contenant rsh le fichier est bien lu en entier.
merci par avance et que ce post vive encore longtemps
while IFS=, read destination propri id
do
echo $id
submitt=`rsh serveurid pdls -r heure-soumission -U serveurid:$id |awk -F "'" ' {print$2}'`
echo $submitt
done < ./printed.log
Voila je veux lire le fichier printed.log ligne par ligne et récuperer une valeur sur une autres serveur par un rsh ( pas de ssh sur cette machine).
Cela ne fonctionne que pour la premiere ligne.
Si je retire la ligne contenant rsh le fichier est bien lu en entier.
merci par avance et que ce post vive encore longtemps
while IFS=, read destination propri id
do
echo $id
submitt=`rsh serveurid pdls -r heure-soumission -U serveurid:$id |awk -F "'" ' {print$2}'`
echo $submitt
done < ./printed.log
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
8 juin 2009 à 16:28
8 juin 2009 à 16:28
essayer avec
submitt=`rsh serveurid pdls -r heure-soumission -U serveurid:$id |awk -F "'" ' {print$2}' < /dev/null`
submitt=`rsh serveurid pdls -r heure-soumission -U serveurid:$id |awk -F "'" ' {print$2}' < /dev/null`
c'est un probleme avec rsh
avec le flag -n cela fonctionne
-n
Specifies that the rsh command should not read from standard input.
longue vie a ce topic
avec le flag -n cela fonctionne
-n
Specifies that the rsh command should not read from standard input.
longue vie a ce topic
Pour que ce topic vive encore longtemps !
J'ai un problème qui m'énerve:
Je veux lire ligne par ligne un fichier et faire un grep sur chaque ligne (si la ligne contient un certain string alors je rajoute une ligne au fichier).
Le problème est que la commande "echo" retire les blancs en début de ligne s'ils existent, ce que je ne veux pas !!
cat monfichier.txt | while read ligne; do
res=`echo $ligne | grep "^.....coucou"`
if $res != ""; then
... traitement
fi
done
Ce qui ne me renvoit rien pcq echo a retirer tous les blancs en début de $ligne
Comment faire alors ??
Un tout grand merci d'avance
J'ai un problème qui m'énerve:
Je veux lire ligne par ligne un fichier et faire un grep sur chaque ligne (si la ligne contient un certain string alors je rajoute une ligne au fichier).
Le problème est que la commande "echo" retire les blancs en début de ligne s'ils existent, ce que je ne veux pas !!
cat monfichier.txt | while read ligne; do
res=`echo $ligne | grep "^.....coucou"`
if $res != ""; then
... traitement
fi
done
Ce qui ne me renvoit rien pcq echo a retirer tous les blancs en début de $ligne
Comment faire alors ??
Un tout grand merci d'avance
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
NikoBe
1 oct. 2009 à 18:08
1 oct. 2009 à 18:08
Salut,
Il ressemble à quoi ton fichier ?
Les "...." devant "coucou" c'est censé être des espaces ?
Déjà avec "echo -e" ça devrait aller mieux, mais y'a plus simple que ta syntaxe...
Il ressemble à quoi ton fichier ?
Les "...." devant "coucou" c'est censé être des espaces ?
Déjà avec "echo -e" ça devrait aller mieux, mais y'a plus simple que ta syntaxe...
NikoBe
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
1 oct. 2009 à 23:03
1 oct. 2009 à 23:03
OK, je suis pas du tout expert en script shell. Qu'est-ce qui serait plus simple comme syntaxe alors ?
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
NikoBe
2 oct. 2009 à 08:59
2 oct. 2009 à 08:59
Peux-tu répondre à la question :
Les "...." devant "coucou" c'est censé être des espaces ?
Ou même afficher (entre balise code) un morceau de ton fichier s'il te plaît, merci.
Les "...." devant "coucou" c'est censé être des espaces ?
Ou même afficher (entre balise code) un morceau de ton fichier s'il te plaît, merci.
NikoBe
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
2 oct. 2009 à 10:48
2 oct. 2009 à 10:48
Bonjour,
mon fichier ressemble à qqch comme ceci:
le traitement à faire porte sur un fichier bien plus grand bien-sûr ^^
Les "......." devant coucou servent à représenter "n'importe quelle séquence de 7 caractères quels qu'ils soient".
On pourrait très bien mettre des espaces à la place pour faire le test
Merci bcp !
mon fichier ressemble à qqch comme ceci:
* TABLES *======= @TABCOPY,ABCDEF. @TABCOPY,GHIJKLM. coucou. @TABCOPY,NOPQRS. @TABCOPY,TUVWXY.
le traitement à faire porte sur un fichier bien plus grand bien-sûr ^^
Les "......." devant coucou servent à représenter "n'importe quelle séquence de 7 caractères quels qu'ils soient".
On pourrait très bien mettre des espaces à la place pour faire le test
Merci bcp !
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
2 oct. 2009 à 11:03
2 oct. 2009 à 11:03
Ok, essaies ça alors :
;-))
ssh$ cat plop * TABLES *======= @TABCOPY,ABCDEF. @TABCOPY,GHIJKLM. coucou. a_2;-:/coucou. @TABCOPY,NOPQRS. @TABCOPY,TUVWXY. ssh$ cat foo.sh #! /bin/sh #set -xv OIFS=$IFS IFS=$'\n' for line in $(cat plop) do grep -q '^.\{7\}coucou' <<<"${line}" if [ "$?" != 1 ] then echo "${line}" fi done ssh$ ./foo.sh coucou. a_2;-:/coucou.
;-))