OVH Cloud OVH Cloud

SHELL UNIX : CONCATENATION FICHIERS ...AU SECOURS !!

8 réponses
Avatar
louise.vaut
Mon employeur me demande des choses trop difficiles pour moi...

Je dois concaténer le contenu de plusieurs fichiers en fonction d'un
critère de leur nom.
Le critère est le 3ème champ du nom du fichier, le séparateur est le
tiret bas _

Exemple , soient 4 fichiers (leur nombre peut varier) :

fic1_aaaa_111.log
fic2_aaaa_222.log
fic3_aaaa_333.log
fic4_bbbb_111.log
fic5_

Je dois faire un shell unix pour :

Créer un fichier FIC_111.log qui contiendra la concaténation du
contenu des fichiers fic1 et fic4 (critère commun 111).
Créer un fichier FIC_222.log qui contiendra la concaténation du
fichier fic2
Créer un fichier FIC_333.log qui contiendra la concaténation du
fichier fic3


Si un ‘supershelliste' avait une solution, voire une ébauche de
solution je serai sauvée !!!
Merci par avance à ceux qui prendront le temps de me lire…

8 réponses

Avatar
Pascal Bourguignon
() writes:

Mon employeur me demande des choses trop difficiles pour moi...


Démissionne et fais lui suivre mon CV !


Je dois concaténer le contenu de plusieurs fichiers en fonction d'un
critère de leur nom.
Le critère est le 3ème champ du nom du fichier, le séparateur est le
tiret bas _

Exemple , soient 4 fichiers (leur nombre peut varier) :

fic1_aaaa_111.log
fic2_aaaa_222.log
fic3_aaaa_333.log
fic4_bbbb_111.log
fic5_

Je dois faire un shell unix pour :

Créer un fichier FIC_111.log qui contiendra la concaténation du
contenu des fichiers fic1 et fic4 (critère commun 111).
Créer un fichier FIC_222.log qui contiendra la concaténation du
fichier fic2
Créer un fichier FIC_333.log qui contiendra la concaténation du
fichier fic3


Si un 'supershelliste' avait une solution, voire une ébauche de
solution je serai sauvée !!!
Merci par avance à ceux qui prendront le temps de me lire.


cat fic?_????_111.log > fic_111.log
cat fic?_????_222.log > fic_222.log
etc...

Si les champs sont de longueur variable:

cat fic*_*_111.log > fic_111.log
cat fic*_*_222.log > fic_222.log


Si il faut trouver les valeurs du troisième champs automatiquement:

for num in $( ls -1 fic* | sed -e 's/fic.*_.*_(.*).log/1/' | sort -u ) ; do
cat fic*_*_${num}.log >> fic_${num}.log
done


--
__Pascal Bourguignon__ http://www.informatimago.com/
You never feed me.
Perhaps I'll sleep on your face.
That will sure show you.

Avatar
Rakotomandimby (R12y) Mihamina
( Thu, 10 Mar 2005 20:19:47 +0100 ) Pascal Bourguignon :

Mon employeur me demande des choses trop difficiles pour moi...
Démissionne et fais lui suivre mon CV !

Toi aussi t'es au chomage ? :-)


zsh :

cd /le/repertoire/
for FICH (*)(CHIFFRE=`print $FICH | awk 'BEGIN {FS="_"}{print $3}'` ;
cat $FICH >> FIC_${CHIFFRE}.log )

je suis sûr qu'on peut directement mettre la première ligne dans la
deuxième et n'en faire qu'une seule, mais bon... j'hésite...

A plus...
--
L'ASPO a pour but de démocratiser l'acces a l'informatique. Une de ses
activité est l'infogerance (http://aspo.rktmb.org/activites/infogerance)
Tél: + 33 2 38 04 26 04 ou + 33 6 33 26 13 14 (France)


Avatar
cedric
wrote:
Mon employeur me demande des choses trop difficiles pour moi...

Je dois concaténer le contenu de plusieurs fichiers en fonction d'un
critère de leur nom.


T'as de la chance d'avoir un boulot amusant comme ca !

Avatar
louise.vaut
"Rakotomandimby (R12y) Mihamina" wrote in message news:...
( Thu, 10 Mar 2005 20:19:47 +0100 ) Pascal Bourguignon :

Mon employeur me demande des choses trop difficiles pour moi...
Démissionne et fais lui suivre mon CV !

Toi aussi t'es au chomage ? :-)


zsh :

cd /le/repertoire/
for FICH (*)(CHIFFRE=`print $FICH | awk 'BEGIN {FS="_"}{print $3}'` ;
cat $FICH >> FIC_${CHIFFRE}.log )

je suis sûr qu'on peut directement mettre la première ligne dans la
deuxième et n'en faire qu'une seule, mais bon... j'hésite...

A plus...



Un grand merci à tous pour vos conseils...

Pour le chomage je connais, mon CDD se termine ... :-(



Avatar
Rakotomandimby (R12y) Mihamina
( Fri, 11 Mar 2005 03:57:48 -0800 ) :

mon CDD se termine ...


ben... tu peux laisser le script de coté, ça les obligera a embaucher
;-) (je rigole)

--
L'ASPO a pour but de démocratiser l'acces a l'informatique. Une de ses
activité est l'infogerance (http://aspo.rktmb.org/activites/infogerance)
Tél: + 33 2 38 04 26 04 ou + 33 6 33 26 13 14 (France)

Avatar
louise.vaut
Pascal Bourguignon wrote in message news:...
() writes:

Mon employeur me demande des choses trop difficiles pour moi...


Démissionne et fais lui suivre mon CV !


Je dois concaténer le contenu de plusieurs fichiers en fonction d'un
critère de leur nom.
Le critère est le 3ème champ du nom du fichier, le séparateur est le
tiret bas _

Exemple , soient 4 fichiers (leur nombre peut varier) :

fic1_aaaa_111.log
fic2_aaaa_222.log
fic3_aaaa_333.log
fic4_bbbb_111.log
fic5_

Je dois faire un shell unix pour :

Créer un fichier FIC_111.log qui contiendra la concaténation du
contenu des fichiers fic1 et fic4 (critère commun 111).
Créer un fichier FIC_222.log qui contiendra la concaténation du
fichier fic2
Créer un fichier FIC_333.log qui contiendra la concaténation du
fichier fic3


Si un 'supershelliste' avait une solution, voire une ébauche de
solution je serai sauvée !!!
Merci par avance à ceux qui prendront le temps de me lire.


cat fic?_????_111.log > fic_111.log
cat fic?_????_222.log > fic_222.log
etc...

Si les champs sont de longueur variable:

cat fic*_*_111.log > fic_111.log
cat fic*_*_222.log > fic_222.log


Si il faut trouver les valeurs du troisième champs automatiquement:

for num in $( ls -1 fic* | sed -e 's/fic.*_.*_(.*).log/1/' | sort -u ) ; do
cat fic*_*_${num}.log >> fic_${num}.log
done


Merci Pascal pour ta solution, je l'ai adaptée et ça marche trés bien.
(Pour ce qui est du chomage, je connais, mon CDD se termine...)

Merci à tous.


Avatar
Pascal Bourguignon
() writes:

"Rakotomandimby (R12y) Mihamina" wrote in message news:...
( Thu, 10 Mar 2005 20:19:47 +0100 ) Pascal Bourguignon :

Mon employeur me demande des choses trop difficiles pour moi...
Démissionne et fais lui suivre mon CV !

Toi aussi t'es au chomage ? :-)


zsh :

cd /le/repertoire/
for FICH (*)(CHIFFRE=`print $FICH | awk 'BEGIN {FS="_"}{print $3}'` ;
cat $FICH >> FIC_${CHIFFRE}.log )
[...]

Un grand merci à tous pour vos conseils...

Pour le chomage je connais, mon CDD se termine ... :-(


Fallait le dire, on aurait proposé des solutions beaucoup plus
complexes, pour garantir l'emploi... ;-)

--
__Pascal Bourguignon__ http://www.informatimago.com/

Nobody can fix the economy. Nobody can be trusted with their finger
on the button. Nobody's perfect. VOTE FOR NOBODY.




Avatar
Laurent Wacrenier
Pascal Bourguignon écrit:
Si il faut trouver les valeurs du troisième champs automatiquement:

for num in $( ls -1 fic* | sed -e 's/fic.*_.*_(.*).log/1/' | sort -u ) ; do
cat fic*_*_${num}.log >> fic_${num}.log
done


Mieux vaut éviter de le lancer deux fois, et c'est plus léger comme ça :

rm -f fic_*.log
for f in fic[^_]*_*_*.log
do
cat $f >> fic_${f#fic*_*_}
done