Se você modificar ligeiramente a solução fornecida por Gilles em esta pergunta (também referido por jw013 ), você pode obter o efeito que você pede, exceto que a ordem é baseada na seqüência de entrada e não é idêntica a output.txt
listado em sua pergunta:
awk -v patterns_file=list.txt '
BEGIN {
while (getline < patterns_file)
patterns_array[">" $0] = 1
close(patterns_file)
}
$0 in patterns_array { print; getline; print }
' sample[1-3].txt
Saída:
>GETID_17049_knownids_1/2_Confidence_0.625_Length_2532
sampletextforsample1
>GETID_11084_knownids_3/3_Confidence_0.600_Length_1451
sampletextforsample2
>GETID_17049_knownids_1/2_Confidence_0.625_Length_2532
sampletextforsample3
>GETID_15916_knownids_10/11_Confidence_0.324_Length_1825
sample2textforsample3
Editar
Para fazer isso funcionar com registros de várias linhas, use um separador de registro apropriado ( RS
). No seu caso, defina-o como: greater-than
no início do arquivo ( ^>
) ou new-line
seguido por greater-than
( \n>
) ou new-line
no final do arquivo ( \n$
) parecem boas escolhas com base na entrada fornecida.
Algo como isso deve funcionar:
awk -v patterns_file=patterns.txt '
BEGIN {
while (getline < patterns_file)
patterns_array[$0] = 1
close(patterns_file)
RS="^>|\n>|\n$"
}
$1 in patterns_array { print ">" $0 }
' sample[1-3].txt
Editar 2
Para produzir cada registro apenas uma vez, exclua-o de patterns_array
após a saída:
awk -v patterns_file=patterns.txt '
BEGIN {
while (getline < patterns_file)
patterns_array[$0] = 1
close(patterns_file)
RS="^>|\n>|\n$"
}
$1 in patterns_array { print ">" $0; delete patterns_array[$1] }
' sample[1-3].txt