Comparaison basée sur les valeurs dans Unix

J’ai deux variables comme ci-dessous.

a=rw,bg,hard,timeo=600,wsize=1048576,rsize=1048576,nfsvers=3,tcp,actimeo=0,noacl,lock b=bg,rg,hard,timeo=600,wsize=1048576,rsize=1048576,nfsvers=3,tcp,actimeo=0,noacl,lock 

Si condition échoue car elle cherche une valeur rw partir d’ a variable à la position 1 dans la variable b mais elle est à la position 2 dans la variable b .

Comment comparer les deux lignes même si l’ordre des champs n’est pas le même?

Ce script semble fonctionner:

 a="rw,bg,hard,timeo=600,wsize=1048576,rsize=1048576,nfsvers=3,tcp,actimeo=0,noacl,lock" b="bg,rg,hard,timeo=600,wsize=1048576,rsize=1048576,nfsvers=3,tcp,actimeo=0,noacl,lock" { echo "$a"; echo "$b"; } | awk -F, \ 'NR == 1 { for (i = 1; i <= NF; i++) a[$i] = 1 } NR == 2 { for (i = 1; i <= NF; i++) { if ($i in a) delete a[$i] else { mismatch++ print "Unmatched item (row 2):", $i } } } END { for (i in a) { print "Unmatched item (row 1):", i mismatch++ } if (mismatch > 0) print mismatch, "Mismatches" else print "Rows are the same" }' 

L’exemple s’exécute:

 $ bash pairing.sh Unmatched item (row 2): rg Unmatched item (row 1): rw 2 Mismatches $ sed -i.bak 's/,rg,/,rw,/' pairing.sh $ bash pairing.sh Rows are the same $ 

Il existe sans aucun doute des moyens de rendre le script plus compact, mais le code est assez simple. Si un champ apparaît deux fois dans la deuxième ligne et apparaît une fois dans la première ligne, le second sera signalé comme un élément sans correspondance. Le code ne vérifie pas les doublons lors du traitement de la première ligne – c’est un exercice facile à réaliser. Le code n’imprime pas les données d’entrée pour vérification; ça devrait probablement.