GNU/Linux >> Tutoriels Linux >  >> Linux

Lignes communes entre deux fichiers ?

Cette question a déjà des réponses ici :Afficher les lignes communes (similitudes) de deux fichiers texte (le contraire de diff) ?

(5 réponses)
Fermé il y a 3 ans.

J'ai le code suivant que j'exécute sur mon Terminal.

LC_ALL=C && grep -F -f  genename2.txt hg38.hgnc.bed > hg38.hgnc.goi.bed

Cela ne me donne pas les lignes communes entre les deux fichiers. Qu'est-ce que je rate là ?

Réponse acceptée :

Utilisez comm -12 file1 file2 pour obtenir des lignes communes dans les deux fichiers.

Vous pouvez également avoir besoin que votre fichier soit trié vers comm fonctionner comme prévu.

comm -12 <(sort file1) <(sort file2)

Depuis man comm :

-1     suppress column 1 (lines unique to FILE1)
-2     suppress column 2 (lines unique to FILE2)

Ou en utilisant grep commande, vous devez ajouter -x option pour faire correspondre la ligne entière comme un motif correspondant. Le F l'option indique grep qui correspondent au modèle en tant que chaîne et non en tant que correspondance d'expression régulière.

grep -Fxf file1 file2

Ou en utilisant awk .

awk 'NR==FNR{seen[$0]=1; next} seen[$0]' file1 file2

Ceci lit toute la ligne de fichier1 dans un tableau appelé seen avec la clé comme ligne entière (en awk le $0 représentent toute la ligne courante).

Nous avons utilisé NR==FNR comme condition pour exécuter son bloc suivi uniquement pour la première entrée fle1 pas fichier2 , car NR dans awk se référer au numéro de ligne de traitement en cours et au FNR fait référence au numéro de ligne actuel dans tous contributions. donc NR est unique pour chaque fichier d'entrée mais FNR est unique pour toutes les entrées.

Le next est-ce qu'il dit awk ne continuez pas le code de repos et recommencez jusqu'à NR wan différent de FNR cela signifie toutes les lignes de fichier1 lu par awk .

Puis le prochain seen[$0] ne fonctionnera que pour le deuxième fichier2 et pour chaque ligne dans fichier2 examinera le tableau et imprimera cette ligne là où elle existe dans le tableau.

Une autre option simple consiste à utiliser sort et uniq :

sort file1 file2|uniq -d

Cela imprimera les deux fichiers triés puis uniq -d n'imprimera que les lignes dupliquées. MAIS cela est accordé lorsqu'il n'y a PAS de lignes dupliquées dans les deux fichiers eux-mêmes, sinon ci-dessous est toujours accordé même s'il y a des lignes dupliquées dans les deux fichiers.

uniq -d <(sort <(sort -u file1) <(sort -u file2))

Linux
  1. Comment synchroniser des fichiers entre deux télécommandes ?

  2. Sortie Les lignes communes (similitudes) de deux fichiers texte (l'opposé de Diff) ?

  3. Extraire du texte entre deux lignes spécifiques ?

  4. Lum - Remplacer les valeurs communes dans deux fichiers selon la première colonne ?

  5. Comment faire la différence (uniquement les ajouts) entre deux fichiers sous Linux

Comment comparer deux fichiers dans un terminal Linux

Comment synchroniser automatiquement des fichiers entre deux serveurs Linux

Produit cartésien de deux fichiers (sous forme d'ensembles de lignes) sous GNU/Linux

extraction de valeurs uniques entre 2 ensembles/fichiers

Compter les lignes dans les fichiers volumineux

Différence d'espace entre deux fichiers sous Linux