Usando números no arquivo A para obter um ID exclusivo do arquivo B com base na ordem especificada pelo arquivo A

Usando números no arquivo A para obter um ID exclusivo do arquivo B com base na ordem especificada pelo arquivo A

Quero usar os números do arquivo whitelist.txtpara obter um número de identificação exclusivo do arquivo list.txtcom 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.txtarquivo de ie 2para 2po qual instrui outer seda 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 %husando o conteúdo do whitelist.txtarquivo, que é o primeiro argumento que precisa ser passado para o Perlcódigo. Observe que o qx[]operador nada mais é do que o backquoteoperador.

  • Em seguida, imprimimos as linhas do segundo argumento, ou seja, list.txtarquivo cujos números de linha são membros do arquivo hash %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

informação relacionada