Script pour la différence entre 2 données à leur path directory - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 09-10-2012 à 02:55:22
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.
Marsh Posté le 09-10-2012 à 09:04:20
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.
Marsh Posté le 09-10-2012 à 09:55:57
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" |
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 :
|
par exemple.
pour vérifier, pour chaque ligne, son existence dans le deuxième fichier, un grep s'impose:
Code :
|
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
Marsh Posté le 09-10-2012 à 10:47:15
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 :
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" |
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: while read -r line |
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 :
|
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
Marsh Posté le 09-10-2012 à 11:11:52
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 :
|
avec ça tu fais un grep sur les fichiers list_Disk(n)/Other
Marsh Posté le 09-10-2012 à 11:25:30
Citation : Code : ligne="DWA_Disk_1/atlantic/polymode/rcm00657.str" avec ça tu fais un grep sur les fichiers list_Disk(n)/Other |
Ah ben oui peut-ètre, merci
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
Marsh Posté le 09-10-2012 à 11:35:29
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 :
|
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 :
|
Marsh Posté le 09-10-2012 à 11:43:16
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. |
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 :
|
Car il m'affiche sur 50 lignes, Next line :s
PS: Bon je vais manger, ej reviens plus tard pour mes tests.
Merci
Marsh Posté le 09-10-2012 à 18:01:33
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 :
|
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 :
|
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 :
|
Marsh Posté le 10-10-2012 à 09:03:50
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
Marsh Posté le 10-10-2012 à 09:46:17
Bon, je viens tester ce que tu m'as dis et c'est super.
Cependant pour :
Citation : # Comparaisons des fichiers |
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
Marsh Posté le 10-10-2012 à 10:14:11
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.
Marsh Posté le 10-10-2012 à 13:53:30
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 ^^
Marsh Posté le 10-10-2012 à 17:36:20
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 :
|
une version plus portable, peut-être
voire, plus rapide
Code :
|
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 ?)
Marsh Posté le 11-10-2012 à 09:21:50
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
Marsh Posté le 11-10-2012 à 09:51:44
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 ....
Marsh Posté le 11-10-2012 à 10:49:37
Bon, on dirait que je vois le bout du tunnel.
J'ai fait ça mais j'ai un tout petit soucis.
Code :
|
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
Marsh Posté le 08-10-2012 à 17:07:23
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