Как сделать так, чтобы читалось быстрее (как использовать grep вместо этого) - PullRequest
0 голосов
/ 25 октября 2018

У меня есть файл с именем «сравнить» и файл с именем «final_contigs_c10K.fa»
Я хочу выделить строки И СЛЕДУЮЩУЮ ЛИНИЮ из «final_contigs_c10K.fa», содержащие определенные строки в «сравнить».
сравнитьвыглядит следующим образом:

k119_1
k119_3
...

и количество строк сравнения равно 26364.
final_contigs_c10K.fa выглядит следующим образом:

>k119_1  
AAAACCCCC  
>k119_2  
CCCCC  
>k119_3  
AAAAAAAA  
...  

Я хочу сделать из final_contigs_c10K.faформат:

>k119_1
AAAACCCCC
>k119_3
AAAAAAAA 
... 

Я попробовал этот код, но этот код занимает слишком много времени, хотя, кажется, работает нормально.Я думаю, что это занимает слишком много времени, потому что количество сравниваемых строк составляет 26364, что слишком много по сравнению с другими моими файлами, на которых я тестировал код.

while read line; do sed -i -e "/$line/ { N; d; }" final_contigs_c10K.fa; done < compare

Есть ли способ сделать эту команду быстрее?

1 Ответ

0 голосов
/ 25 октября 2018

Использование awk

$ awk 'NR==FNR{a[">" $1];next}$1 in a{p=3} --p>0' compare final_contigs_c10K.fa
>k119_1  
AAAACCCCC  
>k119_3  
AAAAAAAA  

Это приведет к выводу на стандартный вывод, т.е.не будет вносить никаких изменений в исходные файлы.

Объяснено:

$ awk '
NR==FNR {                        # process the first file
    a[">" $1]                    # hash to a, adding > while at it
    next                         # process the next record
}                                # process th second file after this point
$1 in a { p=3 }                  # if current record was in compare file set p
--p>0                            # print current file match and the next record
' compare final_contigs_c10K.fa  # mind the file order
...