Quero usar os números do arquivo whitelist.txt
para obter um número de identificação exclusivo do arquivo list.txt
com base na ordem especificada por file whitelist.txt
. Exemplo:
$ 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 forma que eu possa redirecionar para um novo arquivo:
$ cat newfile.txt
172363
612851
172418
19
72457
(+8,000 more lines)
NOTA: Esta questão foi modificada. As respostas abaixo antes de 5 de maio de 2017 foram baseadas em amostras de entrada ( list.txt
) formatadas como (por exemplo, primeira linha) >CLocus_2_Sample_
(em vez de apenas o número 2) e o nome do arquivo era file.fa
(não file.txt
).
Responder1
Com base nos dados revisados, tente algo assim:
$ sed -nf <(sed 's/.*/&p/g' whitelist.txt) list.txt >newfile.txt
Isso transforma as entradas do whitelist.txt
arquivo de ie 2
para 2p
o qual instrui outer sed
a imprimir aquela linha 2
==> igual a sed -n '2p'
==> imprime a segunda linha.
O mesmo acontece para todas as entradas de whitelist.txt
, criando um script sed (alimentando sed externo com substituição de processo), contendo 2p
, 5p
, 7p
,etc e essas linhas de list.txt são impressas.
Alternativa: Pré-processe o 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
Responder2
Em resposta à sua última revisão:
awk 'NR==FNR{z[$1]; next}FNR in z' whitelist.txt list.txt >newfile.txt
Responder3
Com as novas especificações de que você está falando, precisamos modificá-las:
perl -e '
$h{s/\n//r}++ for qx[cat ${\+shift}];
$h{$.} && print while <>;
' whitelist.txt list.txt
Explicação
Primeiro preencha o
hash
%h
usando o conteúdo dowhitelist.txt
arquivo, que é o primeiro argumento que precisa ser passado para oPerl
código. Observe que oqx[]
operador nada mais é do que obackquote
operador.Em seguida, imprimimos as linhas do segundo argumento, ou seja,
list.txt
arquivo cujos números de linha são membros do arquivohash
%h
. Nota: Desde $. é sempre numérico AND > 0, é a razão pela qual podemos usar apenas$h{$.}
em vez do propahexists $h{$.}
Resultados
172363
612851
172418
19
72457