(5 respuestas)
Cerrado hace 3 años.
Tengo el siguiente código que ejecuto en mi Terminal.
LC_ALL=C && grep -F -f genename2.txt hg38.hgnc.bed > hg38.hgnc.goi.bed
Esto no me da las líneas comunes entre los dos archivos. ¿Qué me estoy perdiendo allí?
Respuesta aceptada:
Utilice comm -12 file1 file2
para obtener líneas comunes en ambos archivos.
Es posible que también necesite que su archivo se clasifique en comm
para que funcione como se esperaba.
comm -12 <(sort file1) <(sort file2)
Desde man comm
:
-1 suppress column 1 (lines unique to FILE1)
-2 suppress column 2 (lines unique to FILE2)
O usando grep
comando que necesita agregar -x
opción para hacer coincidir toda la línea como un patrón coincidente. El F
la opción le dice a grep
ese patrón de coincidencia como una cadena, no una coincidencia de expresiones regulares.
grep -Fxf file1 file2
O usando awk
.
awk 'NR==FNR{seen[$0]=1; next} seen[$0]' file1 file2
Esto está leyendo toda la línea de file1 en una matriz llamada seen
con la clave como línea completa (en awk
el $0
representan toda la línea actual).
Usamos NR==FNR
como condición para ejecutar su bloque seguido solo para la primera entrada fle1 no archivo2 , porque NR
en awk
consulte el número de línea de procesamiento actual y FNR
se refiere al número de línea actual en all entradas. entonces NR
es único para cada archivo de entrada pero FNR
es único para todas las entradas.
El next
hay algo que dice awk
no continúe el código de descanso y comience de nuevo hasta NR
no es igual a FNR
eso significa todas las líneas de file1 leído por awk
.
Luego, el próximo seen[$0]
solo se ejecutará para el segundo file2 y para cada línea en file2 buscará en la matriz e imprimirá esa línea donde existe en la matriz.
Otra opción sencilla es usar sort
y uniq
:
sort file1 file2|uniq -d
Esto imprimirá ambos archivos ordenados y luego uniq -d
imprimirá solo líneas duplicadas. PERO esto se otorga cuando NO hay líneas duplicadas en ambos archivos; de lo contrario, siempre se otorga a continuación, incluso si hay líneas duplicadas en ambos archivos.
uniq -d <(sort <(sort -u file1) <(sort -u file2))