Quiero usar los números de archivo whitelist.txt
para obtener un número de identificación único del archivo list.txt
segú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.txt
archivo de ie 2
a 2p
lo que indica a external sed
que 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
, 7p
etc. 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
%h
uso del contenido delwhitelist.txt
archivo, que es el primer argumento que debe pasarse alPerl
código. Tenga en cuenta que elqx[]
operador no es más que elbackquote
operador.Luego imprimimos las líneas del segundo argumento, es decir,
list.txt
el archivo cuyos números de línea son miembros del archivohash
%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