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