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?
text-processing
awk
diff
Velu
la source
la source
diff
.comm
. Il facilite la liste des lignes que les deux fichiers ont en commun ou sont uniques à l'un ou à l'autre.comm
c'est qu'il nécessite une entrée triée. Mis à part le fait que l'exemple de la question a une entrée triée, la question n'affirme jamais que ce sont les données réelles qui sont utilisées et ne dit jamais rien sur l'ordre des données.nl
astuce de αғsнιη est utilecomm
pour imposer un tri sur les fichiers.Réponses:
Utilisez la
diff
commande comme suit, dansbash
ou tout autre shell qui prend en charge les<(...)
substitutions de processus ou vous pouvez l'émuler comme indiqué ici :La sortie serait:
--new-line-format='FALSE'$'\n
, imprimezFALSE
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 l' ancien fichier à la commande diff (nous pourrions également les échanger, ce qui signifie que l'un d'eux devrait imprimerFALSE
un autre devrait être désactivé.)--unchanged-line-format='TRUE'$'\n'
, imprimerTRUE
si les lignes étaient identiques. la$'\n'
syntaxe d'échappement de style C est utilisée pour imprimer une nouvelle ligne après chaque sortie de ligne.la source
En supposant que les fichiers ne contiennent pas de tabulations:
Cela permet
paste
de créer deux colonnes délimitées par des tabulations, avec le contenu des deux fichiers dans l'une ou l'autre colonne. Laawk
commande compare les deux colonnes sur chaque ligne et imprimeTRUE
si les colonnes sont identiques et imprime autrementFALSE
.la source
En supposant que les deux fichiers ont le même nombre de lignes:
Cela fait une comparaison numérique si les chaînes à comparer sont des nombres et lexicales sinon. Par exemple,
100
et1.0e2
serait considéré comme identique. Changez enf2"" == $0
pour forcer une comparaison lexicale dans tous les cas.Selon l'
awk
implémentation, la comparaison lexicale se fera comme si en utilisantmemcmp()
(comparaison octet à octet) ou comme si en utilisantstrcoll()
(si les deux chaînes triaient de la même manière 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.la source
Python 3
Production:
Si vous en avez besoin
TRUE
etFALSE
en majuscules, remplacez la ligne d'impression par l'une des suivantes:la source
import itertools
première, puis utilisez à laitertools.izip
place dezip
. Sinon, il lira les deux fichiers en mémoire, utilisant peut-être trop de mémoire.Dans
bash
, lecture de chaque fichier enwhile
boucle, comparaison des lignes de lecture et impressionTRUE
ou deFALSE
manière appropriée:Les deux appels aux
read
lectures des descripteurs de fichiers 3 et 4 respectivement. Les fichiers sont redirigés vers ceux-ci avec deux redirections d'entrée dans la boucle.la source
production
la source