Comment comparer deux fichiers en script shell?

Voici mon scénario. J’ai deux fichiers qui ont des enregistrements avec chaque enregistrement 3-25 caractères est un identifiant. Sur cette base, je dois les comparer et mettre à jour l’ancien fichier avec les nouvelles données du fichier si leurs identifiants correspondent. Les identifiants commencent par 01. Veuillez regarder le script ci-dessous. Cela donne une erreur comme “argument attendu à la ligne 12 que je ne suis pas capable de comprendre.

#!/bin/ksh while read line do c=`echo $line|grep '^01' ` if [ $c -ne NULL ]; then var=`echo $line|cut -c 3-25` fi while read i do d=`echo $i|grep '^01' ` if [ $d -ne NULL ]; then var1=`echo $i|cut -c 3-25` if [ $var -eq $var1 ]; then $line=$i fi fi done < test_monday done < test_sunday 

S’il vous plaît aidez-moi merci d’avance

Je pense que ce dont vous avez besoin est:

 if [ "$d" != NULL ]; 

Essayer.

A moins que vous n’écriviez un script pour la portabilité sur le shell Bourne d’origine ou sur d’autres qui ne supportent pas la fonctionnalité, dans Bash et ksh, vous devez utiliser la forme [[ de test pour les chaînes et les fichiers.

Il y a un besoin réduit de citer et d’échapper, des conditions supplémentaires telles que la correspondance des motifs et des expressions régulières et la possibilité d’utiliser && et || au lieu de -a et -o .

 if [[ $var == $var1 ]] 

De plus, “NULL” n’est pas une valeur spéciale dans Bash et ksh et votre test réussira toujours puisque $d est testé avec la chaîne littérale “NULL”.

 if [[ $d != "" ]] 

ou

 if [[ $d ]] 

Pour les valeurs numériques (n’incluant pas les zéros à moins que vous n’utilisiez un octal), vous pouvez utiliser des expressions numériques. Vous pouvez omettre le signe dollar pour les variables dans ce contexte.

 numval=41 if ((++numval >= 42)) # increment then test then echo "don't panic" fi 

Il n’est pas nécessaire d’utiliser l’ echo et de cut pour des sous-chaînes. Dans Bash et Ksh, vous pouvez faire:

 var=${line:3:23} 

Remarque: cut utilise des positions de caractères pour le début et la fin d’une plage, alors que cette structure utilise la position de départ et le nombre de caractères. Vous devez donc ajuster les nombres en conséquence.

Et c’est une bonne idée de ne plus utiliser de backticks . Utilisez plutôt $() Cela peut être nested et la citation et la fuite sont réduites ou plus faciles.

Je pense que vous pouvez utiliser la commande DIFF

 diff file1 file2 > whats_the_diff.txt