(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))