Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1740 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Script pour la différence entre 2 données à leur path directory

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Script pour la différence entre 2 données à leur path directory

n°1321080
Abianus
Posté le 08-10-2012 à 17:07:23  profilanswer
 

Bonjour,
 
Je suis sur un ordinateur en stage sous debian 10.04.04 et je ne suis pas admin de celui-ci.
 
Pour mon stage, je fais des scripts principalement en matlab et quelques fois en linux.
N'étant pas une bête en linux, je me débrouille tout seule la pluspart du temps ... sauf là ^^
 
Alors, je vais vous expliqer ce que je veux faire et ce que j'ai fais.
 
J'ai 3 dossiers en local qui sont "une base de données" içi :  /local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_1/
                                                                                        /local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_2/  
                                                                                        /local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/Other/
 
Dans chacun de ces 3 dossiers, il y a plusieurs fichiers et dossiers.
Premièrement je veux récuper tout les données(avec le path directory) se finissant par l'extension '.str' de chaques fichiers pour les mettres respectivement dans un fichier sur mon Bureau avec les noms suivants : list_Disk_1.txt  
                                                       list_Disk_2.txt
                                                       list_Other.txt
 
Ils ont leurs donnée par exemple comme : "DWA_Disk_1/atlantic/locdyn/rcm01141.str", "DWA_Disk_1/atlantic/polymode/rcm00657.str".....
 
Ensuite, je vais créer 3 autres fichiers ayant les 12 dernières lettres de chaques lignes de chacun des fichiers que j'ai créé précédemment.
Ils s'appellent respectivement : list_2_Disk_1.txt
                                             list_2_Disk_2.txt
                                             list_2_Other.txt
 
J'ai réussi à faire toutes ces choses précédement mais je n'arrive pas avoir "le résultat que je veux pour la suite".
 
Voila, les 3 derniers fichiers créés list_2_Disk_1.txt, list_2_Disk_2.txt, list_2_Other.txt ont leurs données se finissant par exemple par "rcm01141.str", "acc05282.str".....
 
Je veux vérifier que par exemple, la 1ère ligne de list_2_Disk_1.txt est dans les lignes de list_2_Disk_2.txt et que si c'est vrai, je veux faire la différences entre ces 2 lignes qui sont les mêmes à la racine, c'est à dire par exemple entre la donnée du path directory de Disk_1 et celle de Disk_2: "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_1/atlantic/locdyn/rcm01141.str" et "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_2/atlantic/locdyn/rcm01141.str"  
s'ils ont tout les 2 cette valeur.
 
Je fais cette vérification pour ètre sur si ces 2 fichiers étant à 2 emplacements différents mais ayant la même fin de nom sont égaux à 100%.
 
Et je veux donc vérifier ligne par ligne, si la 1ère ligne de list_2_Disk_1.txt est dans les lignes de list_2_Disk_2.txt; la 2nd ligne de list_2_Disk_1.txt est dans les lignes de list_2_Disk_2.txt etc .....
Et même chose entre les lignes de list_2_Disk_1.txt et list_2_Other.txt et ausi de  list_2_Disk_2.txt et list_2_Other.txt
 
Je vous montre ce que j'ai fais mais je n'arrive pas avoir le résultat que je veux ....
Je ne sais pas si c'est possible en script linux, c'est pourquoi je vous demande si vous connaisez une ou plusieurs commandes qui pourraient m'aider.
 
 
 
========================================================================================  
 
#!/bin/sh
# List of 'str' files in Disk1
 
cd /local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata;
 
find DWA_Disk_1/ -type f -iname "*.str" > ~/Bureau/list_Disk_1.txt;
 
# List of 'str' files in Disk2
 
find DWA_Disk_2/ -type f -iname "*.str" > ~/Bureau/list_Disk_2.txt;
 
# List of 'str' files in Other
 
find Other/ -type f -iname "*.str" > ~/Bureau/list_Other.txt;
 
# Placement of files
file1="${HOME}/Bureau/list_Disk_1.txt";
file2="${HOME}/Bureau/list_Disk_2.txt";
file3="${HOME}/Bureau/list_Other.txt";
 
file4="${HOME}/Bureau/list_2_Disk_1.txt";
file5="${HOME}/Bureau/list_2_Disk_2.txt";
file6="${HOME}/Bureau/list_2_Other.txt";
 
 
 # Read the file1 and putt inside list_2_Disk_1 the last 12 letters of the data  
 cat $file1  | sed 's/\(.*\)\(.\{12\}\)/\2/' > ~/Bureau/list_2_Disk_1.txt;
 
 
  # Read the file2 and putt inside list_2_Disk_2 the last 12 letters of the data
  cat $file2 | sed 's/\(.*\)\(.\{12\}\)/\2/' > ~/Bureau/list_2_Disk_2.txt;
 
 
   # Read the file3 and putt inside list_2_Other the last 12 letters of the data
                        cat $file3 | sed 's/\(.*\)\(.\{12\}\)/\2/' > ~/Bureau/list_2_Other.txt;
 
   cd /local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata;
 
   # Differences or not between file4 and file5
   while read line;
   do
    while read line1;
    do  
     diff -y --side-by-side $file4 $file5 > ~/Bureau/diff_file4_file5.txt;
 
    done  
 
   done  
   
   # Differences or not between file4 and file6
 
   while read line;
   do
    while read line2;
    do  
     diff -y --side-by-side $file4 $file6 > ~/Bureau/diff_file4_file6.txt;
 
    done  
 
   done    
 
   # Differences or not between file5 and file6
 
   while read line1;
   do
    while read line2;
    do  
     diff -y --side-by-side $file5 $file6 > ~/Bureau/diff_file5_file6.txt;
 
    done  
 
   done  
 
exit 0
 
# Save the script
# Putt the right on the file
# chmod +x ~/Bureau/differences.sh
 
# Execute the script
# ~/Bureau/differences.sh
 
 
========================================================================================


Message édité par Abianus le 08-10-2012 à 17:10:33
mood
Publicité
Posté le 08-10-2012 à 17:07:23  profilanswer
 

n°1321125
Profil sup​primé
Posté le 09-10-2012 à 02:55:22  answer
 

salut,
 
tous les while read line(n) ne servent à rien.
 
-y et --side-by-side, c'est la même la même option : l'un en est la forme courte.
 
ps: tu devrais soigner l'indentation de tes scripts.

n°1321133
Abianus
Posté le 09-10-2012 à 09:04:20  profilanswer
 

Ok, merci pour l'info pour les while ^^
Pour ce qui est de l'indentation, sur ubuntu, c'est nickel ..
Justement, j'ai bien commenté et indenté pour que ce soit lisible mais le copié collé ne reflète pas du tout celà :s dommage

 

PS: pourriez-vous me guidez car je vois ce que je veux faire mais pas trop comment en script linux vu que j'ai tenté des choses mais sans succès.


Message édité par Abianus le 09-10-2012 à 09:04:51
n°1321138
Profil sup​primé
Posté le 09-10-2012 à 09:55:57  answer
 

Citation :

le copié collé ne reflète pas du tout celà

c'est parce que tu n'as pas utilisé les balises code. c'est comme le bouton C/c++, mais au lieu de 'cpp', tu mets 'code'.
 
 
bon, ton script:
Je ne comprend pas bien, ça:

Citation :

Je veux vérifier que par exemple, la 1ère ligne de list_2_Disk_1.txt est dans les lignes de list_2_Disk_2.txt et que si c'est vrai, je veux faire la différences entre ces 2 lignes qui sont les mêmes à la racine, c'est à dire par exemple entre la donnée du path directory de Disk_1 et celle de Disk_2: "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_1/atlantic/locdyn/rcm01141.str" et "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_2/atlantic/locdyn/rcm01141.str"  
s'ils ont tout les 2 cette valeur.


Citation :

Je veux vérifier que par exemple, la 1ère ligne de list_2_Disk_1.txt est dans les lignes de list_2_Disk_2.txt

là, effectivement, si tu veux lire le premier fichier ligne par ligne, en shell, il faut utiliser une boucle while:

Code :
  1. while read -r line
  2. do
  3.    echo "$line"
  4. done < fichier

par exemple.
 
pour vérifier, pour chaque ligne, son existence dans le deuxième fichier, un grep s'impose:

Code :
  1. while read -r line
  2. do
  3.    if grep "$line" fichier_court_2
  4.    then
  5. :
  6.    else
  7. :
  8.    fi
  9. done < fichier_court_1


Citation :

je veux faire la différences entre ces 2 lignes qui sont les mêmes à la racine, c'est à dire par exemple entre la donnée du path directory de Disk_1 et celle de Disk_2: "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_1/atlantic/locdyn/rcm01141.str" et "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_2/atlantic/locdyn/rcm01141.str"  

ça, je ne comprend pas :(

n°1321145
Abianus
Posté le 09-10-2012 à 10:47:15  profilanswer
 

Citation :

c'est parce que tu n'as pas utilisé les balises code. c'est comme le bouton C/c++, mais au lieu de 'cpp', tu mets 'code'.

 

Ok, merci. J'avais vu les balises code pour C/C++ du coup je me suis dit que pour le code script, ça devait pas ètre ça.

 


Citation :


bon, ton script:
Je ne comprend pas bien, ça:
Citation :

 

Je veux vérifier que par exemple, la 1ère ligne de list_2_Disk_1.txt est dans les lignes de list_2_Disk_2.txt et que si c'est vrai, je veux faire la différences entre ces 2 lignes qui sont les mêmes à la racine, c'est à dire par exemple entre la donnée du path directory de Disk_1 et celle de Disk_2: "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_1/atlantic/locdyn/rcm01141.str" et "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_2/atlantic/locdyn/rcm01141.str"  
s'ils ont tout les 2 cette valeur.

 

Oui, c'est un peu compliqué ...... En gros, je vais essayer de réexpliquer :s
J'ai importé les données se finissant par ".str "de 3 dossiers qui étaient en local sur mon pc que j'ai mis sur ~/Bureau/ dans 3 fichiers.

 

Ensuite, j'ai pris les 12 derniers mots de chaque données des 3 fichiers précédents que j'ai créé sur le Bureau(de chaques lignes) que j'ai mis dans 3 autres fichiers.

 

Ensuite, je voulais faire ce que tu me dis :

 
Citation :

pour vérifier, pour chaque ligne, son existence dans le deuxième fichier, un grep s'impose:
Code :

 

   while read -r line
    do
       if grep "$line" fichier_court_2
       then
    :
       else
    :
       fi
    done < fichier_court_1

 

Mais je n'y arrivais pas, j'arrivais juste à trouver les différences entre les 2 fichiers avec la commande "diff"

 

Après avoir fait ce que tu dis, c'est à dire la vérification, je veux faire un "diff" entre les mêmes lignes que j'ai vérifier mais qui sont en local sur mon pc car la j'ai vérifié s'il y avait les mêmes données dans 2 fichiers sur mon Bureau mais qui à la base ont été importé depuis "local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_1/atlantic/locdyn/rcm01141.str" par exemple....

 

Et c'est la que je bloque car je selon ton idée :

Code :
  1. # Fichiers des 3 dossiers ayant des données se finissant en ".str" (avec le path directory juste avant) Par exemple une donnée comme : "DWA_Disk_1/atlantic/polymode/rcm00657.str"
  2. file1="${HOME}/Bureau/list_Disk_1.txt";
  3. file2="${HOME}/Bureau/list_Disk_2.txt";
  4. file3="${HOME}/Bureau/list_Other.txt";
  5. # Fichiers des 3 dossiers ayant des les 12 derniers mots des fichiers précédents Par exemple une donnée comme : "acc05282.str"
  6. file4="${HOME}/Bureau/list_2_Disk_1.txt";
  7. file5="${HOME}/Bureau/list_2_Disk_2.txt";
  8. file6="${HOME}/Bureau/list_2_Other.txt";
  9. # Lecture et vérification des lignes entre file4 et file5
  10. # J'initialise x et y à 0
  11. x=0;
  12. y=0;
  13. #Je me mets en local
  14. cd /local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata;
  15. while read -r line
  16.     do
  17.        y = 1;
  18.        if grep "$line" $file5
  19.        then
  20.               x = 1;
  21.               diff $line in $file1 $file2 > ~/Bureau/diff_file4_file5.txt;         
  22.        else
  23.              echo "Next line"
  24.               x = -1;
  25.        fi
  26.               if $x = -1
  27.               then
  28.                         y = 1;
  29.               fi
  30.     done < $file4
 


Je ne sais pas si ça marche, je n'ai pas encore essayé.

 

file1 et file2 ont comme données comme: "DWA_Disk_1/atlantic/polymode/rcm00657.str" ... donc c'est pour ça que je me met içi cd "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata;"

 

Est-ce que tu as mieux compris ?

 

Merci de ton aide :)
Cordialement


Message édité par Abianus le 09-10-2012 à 11:37:50
n°1321146
Profil sup​primé
Posté le 09-10-2012 à 11:11:52  answer
 

le recours aux fichiers list_2... ne me paraît pas nécessaire:
si $ligne vaut DWA_Disk_1/atlantic/polymode/rcm00657.str
il est possible de retrouver rcm00657.str par un remplacement des paramètres standard:

Code :
  1. ligne="DWA_Disk_1/atlantic/polymode/rcm00657.str"
  2. echo "${ligne##*/}"
  3. rcm00657.str

avec ça tu fais un grep sur les fichiers list_Disk(n)/Other


Message édité par Profil supprimé le 09-10-2012 à 11:40:02
n°1321148
Abianus
Posté le 09-10-2012 à 11:25:30  profilanswer
 

Citation :

 
le recours aux fichiers list_2... ne me paraît pas nécessaire:
si $ligne vaut DWA_Disk_1/atlantic/polymode/rcm00657.str
il est possible de retrouver rcm00657.str par un remplacement des paramètres standard:

 

Code :

 

   ligne="DWA_Disk_1/atlantic/polymode/rcm00657.str"
    echo ${ligne##*/}
    rcm00657.str

 

avec ça tu fais un grep sur les fichiers list_Disk(n)/Other

 

Ah ben oui peut-ètre, merci :D
J'avais fait comme ça car pour bien répartir mon travail mais si en 3 lignes, ça peut le remplacer, c'est super
Mais, j'ai pleins d'autres données étant par exemple : "DWA_Disk_1/artic/parc/rcm01457.str" etc ....

 

Ta solution est bien mais ce que je veux vérifier c'est la fin de chaque ligne comme "rcm00657.str" de chaque fichiers ...
Le ##*/ , je ne vois aps trop ce que veux dire ## mais ej vais rechercher ^^

 

Merci

 

Je vais tester ce que tu m'as dis. Bon j'ai essayé ce que j'ai écris et le soucis c'est que ça lit bien ligne par ligne mais il me renvoit sur genre 50 lignes d'affilées :
Next line
./differences.sh: 60: -1: not found


Message édité par Abianus le 09-10-2012 à 11:29:35
n°1321150
Profil sup​primé
Posté le 09-10-2012 à 11:35:29  answer
 

Citation :

./differences.sh: 60: -1: not found

ça, c'est à cause des espaces autour du signe égal des assignations des variabes x et y: il ne doit pas y avoir d'espaces pour les assignations;
mais il doit y avoir des espaces autour des crochets et du signe égal à l'interieur!
 

Citation :

Code :
  1. if ["x = -1"]


les guillemets sont superflus, on est sûr que la variable n'est composée que d'un seul mot, puisque c'est un nombre entier.
les guillemets sont inutiles
le signe égal effectuera une comparaison lexicale, pas arithmétique!
et il manque un dollar pour désigner une variable.

Code :
  1. if [ $x -eq 1 ]


Message édité par Profil supprimé le 09-10-2012 à 11:39:00
n°1321152
Abianus
Posté le 09-10-2012 à 11:43:16  profilanswer
 

Citation :

es guillemets sont superflus, on est sûr que la variable n'est composée que d'un seul mot, puisque c'est un nombre entier.
les guillemets sont inutiles
le signe égal effectuera une comparaison lexicale, pas arithmétique!
et il manque un dollar pour désigner une variable.
Code :
 
    if [ $x -eq 1 ]


 
Oui, j'avais remarqué pours les guillemets et le $ puisque j'ai édité mon gros message car j'ai fais des "tests" et j'ai vu quand ça marchais pas et quand ça marchais.
 
Merci de ton aide  
 
Je vais voir ce que ça donnne ^^
 
J'ai essayé et j'ai vu que je n'avais plus le problème du -1. Merci même si j'étais sur la bonne voix car j'avais trouvé, je te remercie de ton aide.
Cependant, on dirait qu'il ne passe pas dans mon :

Code :
  1. if grep "$line" $file5
  2.        then
  3.               x = 1;
  4.               diff $line in $file1 $file2 > ~/Bureau/diff_file4_file5.txt;       
  5.        else
  6.              echo "Next line"
  7.               x = -1;


 
Car il m'affiche sur 50 lignes, Next line :s
 
PS: Bon je vais manger, ej reviens plus tard pour mes tests.
 
Merci


Message édité par Abianus le 09-10-2012 à 11:48:25
n°1321176
Nukolau
Posté le 09-10-2012 à 18:01:33  profilanswer
 

Il existe une commande qui permet de comparer deux fichiers et de sortir les lignes presentes dans un fichier et pas dans l'autre. Il s'agit de la commande "comm".
Si ce que j'ai compris de ton problème est juste, ca pourrait t'éviter tous les grep de comparaison :

 
Code :
  1. comm -3 file1 file2
 

affiche les lignes qui ne sont pas communes (donc que dans le fichier 1 ou que dans le fichier 2).

 

Au final, je ferais quelque chose du genre

 
Code :
  1. # Recup des fichier par repertoire
  2. cd /local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata
  3. for i in DWA_Disk_1 DWA_Disk_2 Other
  4. do
  5.   find $i -type f -name "*.str" -printf "%f\n" >> ~/Bureau/$i.txt
  6. done
  7.   # Comparaisons des fichiers
  8. #Disk1 -> Disk2
  9. comm -3 ~/Bureau/DWA_Disk_1.txt ~/Bureau/DWA_Disk_2.txt | sed 's/^[ ^I]*//' > diff_disk1_disk2.txt
  10. #Disk2 -> Other
  11. comm -3 ~/Bureau/DWA_Disk_2.txt ~/Bureau/Other.txt | sed 's/^[ ^I]*//' > diff_disk2_other.txt
  12. #Disk1 -> Other
  13. comm -3 ~/Bureau/DWA_Disk_1.txt ~/Bureau/Other.txt | sed 's/^[ ^I]*//' > diff_disk1_other.txt
 

Les sed permettent de supprimer les espaces et tabulations (il s'agit du ^I, que tu obtiens en faisant la combinaison de touches CTL+V  CTRL+I dans un vi) en début de ligne, la commande comm mettant les differences de la colonne 2 après une tabulations. Ce n'est pas du tout obligatoire surtout si tu veux savori dans quel répertoire il manque le fichier

 

Remarque : suivant le find utilisé, l'option -printf n'existe pas forcément. Dans ce cas, le plus imple est d'ajouter un cut, si il n'y a pas de sous-repertoire, un awk sinon :

Code :
  1. find $i -type f -name "*.str" | cut -d'/' -f2 >> ~/Bureau/$i.txt
  2. find $i -type f -name "*.str" | awk -F'/' '{print $NF}' >> ~/Bureau/$i.txt


Message édité par Nukolau le 09-10-2012 à 18:10:32
mood
Publicité
Posté le 09-10-2012 à 18:01:33  profilanswer
 

n°1321221
Abianus
Posté le 10-10-2012 à 09:03:50  profilanswer
 

Merci pour toutes ces informations ^^
Je connaissais pas cette commande, comme quoi, on en apprend tout les jours :)
 
Je vais tester ce que tu m'a dis et je répondrais si c'était ce que je cherchais mais on dirait que c'est ça.
Pour info, ce que j'avais posté précédement était bon, car il comparait bien la ligne 1 de file1 avec les lignes de file2 mais il ne voulait pas passer dans mon if et donc faire la commande diff qui suivait car il affichait sur 50 lignes et bien plus , le echo de mon else ^^$
 
Merci encore

n°1321228
Abianus
Posté le 10-10-2012 à 09:46:17  profilanswer
 

Bon, je viens tester ce que tu m'as dis et c'est super.
Cependant pour :

Citation :

# Comparaisons des fichiers
#Disk1 -> Disk2
comm -3 ~/Bureau/DWA_Disk_1.txt ~/Bureau/DWA_Disk_2.txt | sed 's/^[ ^I]*//' > diff_disk1_disk2.txt
#Disk2 -> Other
comm -3 ~/Bureau/DWA_Disk_2.txt ~/Bureau/Other.txt | sed 's/^[ ^I]*//' > diff_disk2_other.txt
#Disk1 -> Other
comm -3 ~/Bureau/DWA_Disk_1.txt ~/Bureau/Other.txt | sed 's/^[ ^I]*//' > diff_disk1_other.txt

 

Il me met ça :
comm: fichier 2 n'est pas dans l'ordre attendu
comm: fichier 1 n'est pas dans l'ordre attendu
comm: fichier 2 n'est pas dans l'ordre attendu
comm: fichier 1 n'est pas dans l'ordre attendu
comm: fichier 2 n'est pas dans l'ordre attendu
comm: fichier 1 n'est pas dans l'ordre attendu

 

Je comprends pas trop ce que ça veut dire vu que j'ai jamais utilisé la commande. J'ai regardé le man comm pour voir ce que voulais dire le résultat obtenu dans le diff_disk1_disk2.txt mais j'ai encore du mal à comprendre ^^

 

Si j'ai bien compris, il y a 2 colonnes. La première est pour le 1er fichier et la 2ème pour le 2ème fichier.
Cependant, la commande "-comm -3" va "Afficher les ligne se trouvant dans fichier1 et pas dans fichier2, et inversement."

 

Mais je comprends pas le résultat obtenu : au début de mon fichier, j'ai toutes le début des premières données de fichier2 dans la 2ème colonne, puis après j'ai celle de fichier1, puis après fichier 2 et après finalement, fichier1 ...

 

Pourrais-tu m'expliquer assez clairement ce que ça veut dire car là je comprends pas trop ce que ça veut dire Oo

 


Message édité par Abianus le 10-10-2012 à 13:53:26
n°1321230
Nukolau
Posté le 10-10-2012 à 10:14:11  profilanswer
 

En fait la commande comm affiche 3 colonnes :
1 - Les lignes présentes dans le fichier 1 et pas dans le fichier 2
2 - Les lignes présentes dans le fichier 2 et pas dans le fichier 1
3 - Les lignes communes aux deux fichiers
 
La commande "comm -3" a pour effet de supprimer l'affichage de la 3eme colonne, la commande "comm -12" aurait pour effet de n'afficher que les lignes communes, etc.
 
Concernant ton message d'erreur, je pense qu'en fait il faut que les fichier soient triés de la même façon. D'après le man :
 

Citation :

Comm  reads  file1 and file2, which should be ordered in the current collating sequence


 
du coup en ajoutant un sort dans ton find du début, je pense que ce message n'apparaîtra plus.

n°1321252
Abianus
Posté le 10-10-2012 à 13:53:30  profilanswer
 

Finalement la commande comm est bien, je veux bien vérifier si la ligne 1 de fichier 1 est dans les lignes de fichier 2 mais ENSUITE, je ne veux pas faire la commande "comm" pour ces 2 fichiers là.
 
Je veux faire la commande "comm" de ces fichiers qui sont de bases en local, c'est à dire :
 
-- je créer une variable genre : directory =  "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata";
Ensuite, j'ai 3 autres fichiers ayant la même chose que ce qu'à créer les fichier dans ton for mais ils ont devant leur path directory, par exemple : "DWA_Disk_1/artic/parc/rcm01457.str"
 
Du coup, je veux concaténer les 2 si par exemple il y a "rcm01457.str" dans fichier 1 et fichier 2.
Donc j'aurais ensuite, la commande comm de cette concaténation de chacun, par exemple:
comm -3 ou commande diff de la concaténation de directory et list_Disk_1.txt pour que ça fasse en tout : diff ou comm - 3 "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_1/artic/parc/rcm01457.str" "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/Other/artic/paee/rcm01457.str" mais en variable  
 
Je chercher encore ce problème car faire diff etre 2 fichiers ou comm, c'est compréhensible, mais là dure ^^
 
 

n°1321276
Profil sup​primé
Posté le 10-10-2012 à 17:36:20  answer
 

j'ai l'impression que tu t'embêtes beaucoup avec des fichiers courts et des fichiers longs, qui te font faire deux fois ± le même boulot pour finalement vérifier que les fichiers *.str sont ou pas identiques:

Code :
  1. #!/bin/bash
  2. # nécessite Bash >=4.0
  3. shopt -s globstar nullglob
  4. status() {
  5.    test -f "$2/$1" && r="existe" || r="n'existe pas"; echo "$1 $r dans $2"
  6. }
  7. data="/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata"
  8. dir="$data/DWA_Disk_1"
  9. for f in "$dir"/**/*.str
  10. do
  11.    for d in DWA_Disk_2 Other
  12.    do 
  13.       status "${f##$dir}" "$data/$d"
  14.    done
  15. done
  16. dir="$data/DWA_Disk_2"
  17. for f in "$dir"/**/*.str
  18. do
  19.    status "${f##$dir}" "$data/Other"
  20. done


 une version plus portable, peut-être
 voire, plus rapide
 

Code :
  1. #!/bin/sh
  2. status() {
  3.    test -f "$2/$1" && r="existe" || r="n'existe pas"; echo "$1 $r dans $2"
  4. }
  5. export status
  6. data="/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata"
  7. dir="$data/DWA_Disk_1"
  8. find "$dir" -type f -name "*.str" -exec /bin/sh -c 'for d in DWA_Disk_2 Other
  9.    do
  10.       status "${1##$dir}" "$data/$d"
  11.    done' {} {} \;
  12. dir="$data/DWA_Disk_2"
  13. find "$dir" -type f -name "*.str" -exec /bin/sh -c 'status "${1##$dir} "$data/Other"' {} {} \;

la fonction status doit être modifiée pour utiliser diff ou comm (as-tu besoin d'afficher les différences, ou seulement d'effectuer une action si les fichiers sont différents ?)

n°1321429
Abianus
Posté le 11-10-2012 à 09:21:50  profilanswer
 

Salut,
Je te remercie de ton aide et je vais essayer de comprendre ton code avant de l'essayer ^^
Je veux effectuer la commande diff des 2 donnée(mais en local) qui s'ils le sont dans fichier1 et fichier2 pour voir si en local, ils sont à l'intérieur exactement les mêmes ou pas.
 
Merci encore

n°1321438
Abianus
Posté le 11-10-2012 à 09:51:44  profilanswer
 

Bon j'ai essayé de comprendre ce que tu voulais dire.
En faite, j'importe les données *.str qui sont dans "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_1/", "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_2/", "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/Other/" sur mon Bureau car en faite, il a d'autres dossiers et sous répertoires dans ces dossiers ou sont aussi ces .str
 
Ce que je veux faire, moi, c'est comparer s'il y a "rcm01457.str" dans DWA_Disk_1 et Other qui est la fin d'une donnée de .str qui est localisé par exemple : "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_1/artic/parc/rcm01457.str" dans DWA_Disk_1 et "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/Other/artic/paee/rcm01457.str" dans Other.
 
Je fais une comparaison s'il y a rcm01457.str dans le fichier sur mon Bureau ou j'ai importé les données qui sont en local entre DWA_Disk_1 et Other.
Après je fais un diff de ces données qui sont en local.
 
J'arrive à faire la comparaison mais la commande diff ou comm ne marche pas comme je veux ....

n°1321444
Abianus
Posté le 11-10-2012 à 10:49:37  profilanswer
 

Bon, on dirait que je vois le bout du tunnel.

 

J'ai fait ça mais j'ai un tout petit soucis.

Code :
  1. #!/bin/sh
  2. cd /local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata;
  3. # List of 'str' files in Disk1
  4. find DWA_Disk_1/ -type f -iname "*.str" > ~/Bureau/list_Disk_1.txt;
  5. # List of 'str' files in Disk2
  6. find DWA_Disk_2/ -type f -iname "*.str" > ~/Bureau/list_Disk_2.txt;
  7. # List of 'str' files in Other
  8. find Other/ -type f -iname "*.str" > ~/Bureau/list_Other.txt;
  9. # Placement of files
  10. file1="${HOME}/Bureau/list_Disk_1.txt";
  11. file2="${HOME}/Bureau/list_Disk_2.txt";
  12. file3="${HOME}/Bureau/list_Other.txt";
  13. file4="${HOME}/Bureau/DWA_Disk_1.txt";
  14. file5="${HOME}/Bureau/DWA_Disk_2.txt";
  15. file6="${HOME}/Bureau/Other.txt";
  16. # List of the end of data from Disk1, Disk2 and Other
  17. for i in DWA_Disk_1 DWA_Disk_2 Other
  18. do
  19.  find $i -type f -name "*.str" -printf "%f\n" >> ~/Bureau/$i.txt;
  20. done
  21.   #Initialize x and y at 0
  22.   x=0;
  23.   y=0;
  24.   #Go in the local path directory
  25.   data="/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata";
  26.   dir1="$data/DWA_Disk_1";
  27.   dir2="$data/DWA_Disk_2";
  28.   dir3="$data/Other";
  29.   #Differences or not between file4 and file6
  30.   while read -r line;
  31.   do
  32.    y=1;
  33.    if grep "$line" $file6
  34.    then
  35.     directory1="$dir1/$line";
  36.     directory3="$dir3/$line";
  37.     diff "$directory1" "$directory3" > ~/Bureau/diff_file4_file6.txt;
  38.    else
  39.     echo "Next line";
  40.     x=-1;
  41.    fi
  42.     if [ $x -eq 1 ]
  43.     then
  44.      y=1;
  45.     fi
  46.   done < $file4
  47. exit 0
 

J'arrive bien à comparer les lignes mais quand il y a par exemple "rcm01457.str" qui est dans DWA_Disk_1 et Other, et bien il me dit qu'il n'y a pas de ficheir car il va chercher dans:
"/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_1/rcm01457.str" et "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/Other/rcm01457.str"
alors que c'est par exemple dans :
"/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/DWA_Disk_1/atlantic/locdyn/rcm01457.str" et "/local/tmp/1/cwright/DB/GMACMD/GMACMDdata/OSUdata/Other/artatic/laclan/rcm01457.str"

 

Dans file1, j'ai les données de DWA_Disk_1 avec le path directory commançant par DWA_Disk_1, par exemple : "DWA_Disk_1/atlantic/locdyn/rcm01457.str"
et la même chose pour file2 --> DWA_Disk_2 et file3 pour Other.

 

Mais quand j'essaye de mettre dir1="$data/$file1", ça ne marche pas car file1="${HOME}/Bureau/list_Disk_1.txt"
Du coup, je voudrais que j'ai à la fin directory1="$dir1/$line_mais_de_file1 car c'est la même line que file4 sauf qu'il y a le path devant.

 

Cependant, je me vois mal refaire un while read line suivit d'un grep juste pour ça ....

 

Vous auriez une idée?

 

Merci


Message édité par Abianus le 11-10-2012 à 13:04:50

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Script pour la différence entre 2 données à leur path directory

 

Sujets relatifs
Script pour obtenir le nom, l'IP et la MAc des PC du réseauCacti : graph du résultat d'un script shell d'un hôte distant
Script KSH et portée des variables : helpScript ksh pour Solaris
Aide sur script bashAide pour script curl
Script de post installation dans un RPMScript Bash pour récuperer seulement l'adresse IP
Données SMART: Faut-il s'affoler ? 
Plus de sujets relatifs à : Script pour la différence entre 2 données à leur path directory


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR