2017-07-24 3 views
0

J'ai essayé un certain nombre de solutions de Stack Overflow, mais sans résultat favorable. J'ai 2 fichiers et je veux supprimer les entrées de file1 qui sont mentionnés dans file2.Diff entre 2 fichiers (awk)

Fichier1

1,[email protected],9 
9,[email protected],1 
8,[email protected],6 
2,[email protected],1 
15,[email protected],3 
6,[email protected],1 

Fichier2

[email protected] 
[email protected] 
[email protected] 
[email protected] 

Résultat

1,[email protected],9 
8,[email protected],6 
2,[email protected],1 
6,[email protected],1 

Pourriez-vous me aider s'il vous plaît? Ma tentative avortée:

awk -F',' 'NR==FNR{c[$1]++;next};c[$2] > 0' file2 file1 

Répondre

1

essayez de suivre awks et laissez-moi savoir si cela vous aide.

Solution 1er:

awk 'FNR==NR{a[$0];next} ($2 in a){next} 1' File2 FS="," File1 

Solution 2:

awk 'FNR==NR{a[$0];next} !($2 in a)' File2 FS="," File1 
+2

L'une ou l'autre de ces réponses est la bonne réponse ('awk -F, 'FNR == NR {a [$ 0]; next}! ($ 2 dans a)' File2 File1' étant l'évidence/commune/idiomatique). Si elles ne fonctionnent pas pour vous alors vous avez probablement control-Ms dans votre fichier d'entrée alors utilisez 'dox2unix' ou similaire pour les supprimer. –

+0

Si vous n'avez pas l'utilitaire dos2unix, essayez les commandes (tr -d '\ r' temp_Input_file && mv temp_Input_file Input_file). – RavinderSingh13

+0

@ RavinderSingh13 Merci beaucoup pour cette solution, elle fonctionne parfaitement, je pense que c'est la meilleure réponse. – Anouar

3

depuis s'il n'y a aucune chance de faux positifs, cela pourrait être le plus facile

$ grep -vf file2 file1  

1,[email protected],9 
8,[email protected],6 
2,[email protected],1 
6,[email protected],1 

une meilleure idée est de changer de chaînes fixes (au lieu de correspondance de motif)

$ grep -vfF file2 file1 
+0

Un scénario outrageusement improbable: l'un des domaines dans '' file2' est example.ac' (Sainte-Hélène, Ascension, Tristan de Cunha), et l'un des domaines de 'file1' est' example.ac.uk' - false match. Cela dit, il est incroyablement improbable comme un problème. –

+0

Merci @Karakfa pour votre réponse rapide ur, mais \t malheureusement, il imprime toutes les lignes :( – Anouar

+0

Probablement '-vxFf', comme vous avez besoin de chaînes fixes, pas de motifs, et compte tenu de ce que Jonathan Leffler a écrit – user31264

1

Voici mon fichier awk qui fait cela:

FNR==1 {NFILE++} 

NFILE==1 {a[++n]=$0} 

NFILE==2 {b[$0]} 

END {for (i=1; i<=n; i++) if (!(a[i] in b)) print(a[i])} 

Il imprime toutes les lignes de fichier1 qui ne sont pas dans le fichier 2, selon votre exemple.

+0

Tahnk vous, mais quand puis-je mettre le nom de fichier? – Anouar

+0

@Anouar awk -f prog.awk fichier1 fichier2 – user31264

+0

Thx, ne fonctionne toujours pas, j'essaie d'ajouter séparateur même chose, j'utilise centos 6.9 avec awk version 4.0.2/je vais passer à un autre dist pour tenter ma chance – Anouar