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?
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.
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
.
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.
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')
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.
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