Usando números no arquivo A para obter um ID único do arquivo B baseado na ordem especificada pelo arquivo A

2

Eu 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 pelo arquivo 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)

Tal 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 anteriores a 5 de maio de 2017 foram baseadas em amostras de entrada ( list.txt ) que foram formatadas como (por exemplo, primeira linha) >CLocus_2_Sample_ (em vez de apenas o número 2) e o nome do arquivo foi file.fa (não% código%).

    
por Age87 26.04.2017 / 23:47

3 respostas

2

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 arquivo whitelist.txt de, por exemplo, 2 a 2p , que instrui o% externosed a imprimir essa 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 o sed externo com a substituição do processo), contendo 2p , 5p , 7p , etc e as 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
    
por 05.05.2017 / 23:46
2

Em resposta à sua última revisão:

awk 'NR==FNR{z[$1]; next}FNR in z' whitelist.txt list.txt >newfile.txt
    
por 05.05.2017 / 23:48
1

Com as novas especificações de que você está falando, precisamos modificá-lo:

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 do arquivo whitelist.txt , que é o primeiro argumento que precisa ser passado para o código Perl . Observe que o operador qx[] não é nada além do operador backquote .

  • Em seguida, imprimimos as linhas do segundo argumento, isto é, list.txt , cujos números de linha são membros de hash %h . Nota: desde $. é sempre numérico E > 0, é a razão pela qual podemos usar apenas $h{$.} em vez do propah exists $h{$.}

Resultados

172363
612851
172418
19
72457
    
por 27.04.2017 / 05:12