Я пытаюсь извлечь идентификатор последовательности и номер кластера, которые встречаются на разных строках одного и того же текстового файла.
Вход выглядит как
>Cluster 72
0 319aa, >O311_01007... *
>Cluster 73
0 318aa, >1494_00753... *
1 318aa, >1621_00002... at 99.69%
2 318aa, >1622_00575... at 99.37%
3 318aa, >1633_00422... at 99.37%
4 318aa, >O136_00307... at 99.69%
>Cluster 74
0 318aa, >O139_01028... *
1 318aa, >O142_00961... at 99.69%
>Cluster 75
0 318aa, >O300_00856... *
. Желаемый вывод идентификатор последовательности в одном столбце и номер соответствующего кластера во втором.
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75
Может ли кто-нибудь помочь с этим?
Вот альтернатива Ruby как однострочный:
ruby -ne 'case $_; when /^>Cluster (\d+)/;id = $1;when /, (>\w{4}_\w{5})\.\.\./;puts "#{$1} #{id}";end' input_file
или разброс по нескольким строкам:
ruby -ne 'case $_
when /^>Cluster (\d+)/
id = $1
when /, (>\w{4}_\w{5})\.\.\./
puts "#{$1} #{id}"
end' input_file
Я думаю, что это только более читаемо, чем awk, если вы знаете Ruby и regexen. В качестве бонуса этот код может быть немного более надежным, чем просто разделение строк, потому что он ищет окружающий текст.
С awk:
awk -F '[. ]*' 'NF == 2 {id = $2; next} {print $3, id}' input-file
мы разделяем поля на пространства или периоды с -F '[. ]*' с линиями из двух полей (строки >Cluster), сохраняем второе поле как идентификатор и перемещаем на следующую строку с другими строками, напечатайте третье поле и сохраненный идентификатор Вы можете использовать awk для этого:
awk '/>Cluster/{
c=$2;
next
}{
print substr($3,2,length($3)-4), c
}' file
Первый оператор блока записывает идентификатор кластера. Оператор второго блока (по умолчанию) извлекает нужные данные и печатает его.
Perl:
$ perl -ne 'if(/^>.*?(\d+)/){$n=$1;}else{ s/.*(>[^.]+).*/$1 $n/; print}' file
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75
Или для более awk-подобного подхода:
$ perl -lane 'if($#F==1){$n=$F[1]}else{$F[2]=~s/\.+$//; print "$F[2] $n"}' file
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75
Это всего лишь несколько более громоздкий способ сделать ту же основную идею, что и различные awk подходы. Я включаю его ради завершения и для поклонников Perl. Если вам нужно объяснение, просто используйте awk-решения:).
Вот альтернатива Ruby как однострочный:
ruby -ne 'case $_; when /^>Cluster (\d+)/;id = $1;when /, (>\w{4}_\w{5})\.\.\./;puts "#{$1} #{id}";end' input_file
или разброс по нескольким строкам:
ruby -ne 'case $_
when /^>Cluster (\d+)/
id = $1
when /, (>\w{4}_\w{5})\.\.\./
puts "#{$1} #{id}"
end' input_file
Я думаю, что это только более читаемо, чем awk, если вы знаете Ruby и regexen. В качестве бонуса этот код может быть немного более надежным, чем просто разделение строк, потому что он ищет окружающий текст.
С awk:
awk -F '[. ]*' 'NF == 2 {id = $2; next} {print $3, id}' input-file
мы разделяем поля на пространства или периоды с -F '[. ]*' с линиями из двух полей (строки >Cluster), сохраняем второе поле как идентификатор и перемещаем на следующую строку с другими строками, напечатайте третье поле и сохраненный идентификатор Вы можете использовать awk для этого:
awk '/>Cluster/{
c=$2;
next
}{
print substr($3,2,length($3)-4), c
}' file
Первый оператор блока записывает идентификатор кластера. Оператор второго блока (по умолчанию) извлекает нужные данные и печатает его.
Perl:
$ perl -ne 'if(/^>.*?(\d+)/){$n=$1;}else{ s/.*(>[^.]+).*/$1 $n/; print}' file
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75
Или для более awk-подобного подхода:
$ perl -lane 'if($#F==1){$n=$F[1]}else{$F[2]=~s/\.+$//; print "$F[2] $n"}' file
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75
Это всего лишь несколько более громоздкий способ сделать ту же основную идею, что и различные awk подходы. Я включаю его ради завершения и для поклонников Perl. Если вам нужно объяснение, просто используйте awk-решения:).