Usar números en el archivo A para obtener una identificación única del archivo B según el orden especificado en el archivo A

Usar números en el archivo A para obtener una identificación única del archivo B según el orden especificado en el archivo A

Quiero usar los números de archivo whitelist.txtpara obtener un número de identificación único del archivo list.txtsegún el orden especificado por el archivo whitelist.txt. Ejemplo:

$ cat whitelist.txt:  
2  
5  
7  
10   
11
(+8,000 more lines)

$ cat list.txt  
2  
172363  
14  
17  
612851  
172414  
172418  
172419  
172424  
19  
72457  
(+ 150,000 more lines)

De modo que pueda redirigir a un nuevo archivo:

$ cat newfile.txt  
172363  
612851  
172418  
19   
72457  
(+8,000 more lines)

NOTA: Esta pregunta ha sido modificada. Las respuestas a continuación antes del 5 de mayo de 2017 se basaron en muestras de entrada ( list.txt) que tenían el formato (por ejemplo, primera fila) >CLocus_2_Sample_(en lugar de solo el número 2) y el nombre del archivo era file.fa(no file.txt).

Respuesta1

Según los datos revisados, intente algo como esto:

$ sed -nf <(sed 's/.*/&p/g' whitelist.txt) list.txt >newfile.txt

Esto transforma las entradas del whitelist.txtarchivo de ie 2a 2plo que indica a external sedque imprima esa línea 2==> es igual a sed -n '2p'==> imprime la segunda línea.
Lo mismo sucede con todas las entradas de whitelist.txt, creando un script sed (alimentando sed externo con sustitución de procesos), que contiene 2p, 5p, 7petc. y esas líneas de list.txt se imprimen.

Alternativa: preprocesar el whitelist.txt:

sed 's/.*/&p/g' whitelist.txt >whitelist2.txt  #or sed -i '....' whitelist.txt to overwrite whitelist.txt
sed -nf whitelist2.txt list.txt # you can redirect output to >newfile.txt

Respuesta2

En respuesta a su última revisión:

awk 'NR==FNR{z[$1]; next}FNR in z' whitelist.txt list.txt >newfile.txt

Respuesta3

Con las nuevas especificaciones de las que hablas, necesitamos modificarlo:

perl -e '
   $h{s/\n//r}++ for qx[cat ${\+shift}];
   $h{$.} && print while <>;
' whitelist.txt list.txt

Explicación

  • Primero complete el hash %huso del contenido del whitelist.txtarchivo, que es el primer argumento que debe pasarse al Perlcódigo. Tenga en cuenta que el qx[]operador no es más que el backquoteoperador.

  • Luego imprimimos las líneas del segundo argumento, es decir, list.txtel archivo cuyos números de línea son miembros del archivo hash %h. Nota: Desde $. es siempre numérico Y > 0, es la razón por la que podemos salirnos con la nuestra usando just $h{$.}en lugar de propahexists $h{$.}

Resultados

172363
612851
172418
19
72457

información relacionada