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