Распечатайте группу строк, если они содержат определенные строки

У меня есть файл (file 1) это похоже на это:

>C 0
0   4231aa, >A6_03412... at 1:4226:1:4240/95.44%
1   4240aa, >A5_01600... *
>C 1
0   4159aa, >FG1_03697... *
>C 2
0   3942aa, >A3_03045... at 1:3942:1:3945/96.50%
1   3945aa, >A4_03199... *
2   3942aa, >A7_02989... at 1:3942:1:3945/92.11%
3   3941aa, >A6_03202... at 1:1:1:1/96.35%

Я рассматриваю часть между двумя >C как подгруппа. Так, например, это - подгруппа

 >C 0
 0  4231aa, >A6_03412... at 1:4226:1:4240/95.44%
 1  4240aa, >A5_01600... *

У меня есть затем другой файл (file 2) содержа строки в подгруппе:

A6_03412
A4_03199
.....

Я хочу распечатать всю подгруппу, которые содержат строку в file 2. Так рассмотрение этого в file 2 У меня просто есть вышеупомянутые строки, которыми должен быть вывод:

>C 0
0   4231aa, >A6_03412... at 1:4226:1:4240/95.44%
1   4240aa, >A5_01600... *
>C 2
0   3942aa, >A3_03045... at 1:3942:1:3945/96.50%
1   3945aa, >A4_03199... *
2   3942aa, >A7_02989... at 1:3942:1:3945/92.11%
3   3941aa, >A6_03202... at 1:1:1:1/96.35%

Это - жесткое, какое-либо предложение, как сделать это со сценарием удара?

4
задан 9 March 2015 в 21:36

2 ответа

Решение с двумя частями с помощью Perl и grep:

perl -pe 's/^>C \d+$/\0$&/' file1 | grep -zFf file2
  • С тех пор >C <some number> разделяет группы, я соответствую этому и вставляю ASCII nul символ (\0) перед каждой группой.
  • Затем я могу использовать в своих интересах grepспособность иметь дело с NUL-разграниченными строками (-z), при чтении шаблонов из файла (-f file2).

С awk я сделал бы что-то подобное, при помощи >C как разделитель записей и печать NUL перед каждой записью:

awk -v RS='>C ' '{printf "\0>C %s", $0}' foo | grep -zFf ba
4
ответ дан 1 December 2019 в 09:49

Вот подход Python:

#!/usr/bin/env python2
with open('file_1') as f_1, open('file_2') as f_2:
    f_1_subgroups = f_1.read().split('>C')
    f_2_lines = [line.rstrip() for line in f_2]
    for subgroup in f_1_subgroups:
        for line in f_2_lines:
            if line in subgroup:
                print '>C' + subgroup

Здесь мы сначала разделили "file_1" на подгруппы с помощью разделителя >C, тогда мы искали строки "file_2" в подгруппе. Если найдено, мы распечатали подгруппу.

Используя понимание списка:

#!/usr/bin/env python2
with open('file_1') as f_1, open('file_2') as f_2:
    f_1_subgroups = f_1.read().split('>C')
    f_2_lines = [line.rstrip() for line in f_2]
    print ''.join(['>C' + subgroup for line in f_2_lines for subgroup in f_1_subgroups if line in subgroup])
0
ответ дан 1 December 2019 в 09:49

Другие вопросы по тегам:

Похожие вопросы: