web-dev-qa-db-fra.com

Comment comparer deux fichiers différents ligne par ligne sous Unix?

Fichier1:

123
234
345
456

Fichier2:

123
234
343
758

Sortie attendue: File3:

TRUE
TRUE
FALSE
FALSE

le code doit donc comparer deux fichiers et afficher "VRAI" s'il correspond, sinon il doit afficher "FAUX" dans le nouveau fichier. Quelqu'un pourrait-il s'il vous plaît fournir la solution pour cela?

13
Velu

Utilisez la commande diff comme suit, dans bash ou tout autre shell qui prend en charge <(...)substitutions de processus ou vous pouvez l'émuler comme montré ici :

diff --new-line-format='FALSE'$'\n' \
     --old-line-format='' \
     --unchanged-line-format='TRUE'$'\n' \
<(nl file1) <(nl file2)

La sortie serait:

TRUE
TRUE
FALSE
FALSE

--new-line-format='FALSE'$'\n, affichez FALSE si les lignes étaient différentes et avec --old-line-format='' nous désactivons la sortie si la ligne était différente pour le fichier1 qui est connu sous le nom de ancien fichier pour la commande diff (nous pourrions également les échanger, ce qui signifie que l'un des ils doivent afficher FALSE un autre doit être désactivé.)

--unchanged-line-format='TRUE'$'\n', affichez TRUE si les lignes étaient identiques. le $'\n' La syntaxe d'échappement de style C est utilisée pour imprimer une nouvelle ligne après chaque sortie de ligne.

56
αғsнιη

En supposant que les fichiers ne contiennent pas de tabulations:

$ paste file1 file2 | awk -F '\t' '{ print ($1 == $2 ? "TRUE" : "FALSE") }'
TRUE
TRUE
FALSE
FALSE

Cela utilise paste pour créer deux colonnes délimitées par des tabulations, avec le contenu des deux fichiers dans l'une ou l'autre colonne. La commande awk compare les deux colonnes sur chaque ligne et affiche TRUE si les colonnes sont identiques et imprime sinon FALSE.

24
Kusalananda

En supposant que les deux fichiers ont le même nombre de lignes:

awk '{getline f2 < "file2"; print f2 == $0 ? "TRUE" : "FALSE"}' file1

Cela fait une comparaison numérique si les chaînes à comparer sont des nombres et lexicales sinon. Par exemple, 100 Et 1.0e2 Seraient considérés comme identiques. Passez à f2"" == $0 Pour forcer une comparaison lexicale dans tous les cas.

Selon l'implémentation de awk, la comparaison lexicale se fera comme si en utilisant memcmp() (comparaison octet à octet) ou comme si en utilisant strcoll() (que le deux chaînes trient la même chose dans l'ordre de classement des paramètres régionaux). Cela peut faire une différence dans certains paramètres régionaux où l'ordre n'est pas correctement défini pour certains caractères, pas sur toutes les entrées de chiffres décimaux comme dans votre exemple.

10
Stéphane Chazelas

Python 3

with open('file1') as file1, open('file2') as file2:
    for line1, line2 in Zip(file1, file2):
        print(line1 == line2)

Production:

True
True
False
False

Si vous avez besoin de TRUE et FALSE en majuscules, remplacez la ligne d'impression par l'une des suivantes:

print(str(line1 == line2).upper())
print('TRUE' if line1 == line2 else 'FALSE')
7
wjandrea

Dans bash, lecture de chaque fichier dans une boucle while, comparaison des lignes de lecture et impression de TRUE ou FALSE de manière appropriée:

while IFS= read -r -u3 line1; IFS= read -r -u4 line2; do
    [[ $line1 == $line2 ]] && echo TRUE || echo FALSE
done 3<file1 4<file2

Les deux appels à read lisent respectivement les descripteurs de fichier 3 et 4. Les fichiers sont redirigés vers ceux-ci avec deux redirections d'entrée dans la boucle.

4
glenn jackman
Tried with awk command and it worked fine


awk 'NR==FNR{a[$1];next}{if ($1 in a){print "TRUE"} else{print "False"}}' file1 file2

production

TRUE
TRUE
False
False
0
Praveen Kumar BS