У меня есть файл (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%
Это - жесткое, какое-либо предложение, как сделать это со сценарием удара?
Решение с двумя частями с помощью 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
Вот подход 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])