РЕДАКТИРОВАТЬ 2: Так как OP упомянул * иногда не может быть строки chr
, поэтому добавление логики для получения любого вида вывода строк.
awk -F"[:|]" '
/^>/ !e[$0]++{
sub(/>/,"",$1)
for(i=2;i<=NF;i++){
num=split($i,array,"[- (]")
if(!b[array[1]"("array[num-1]array[num]]++){
print array[1],array[2],array[3],$1
}
delete array
}
}' Input_file
РЕДАКТИРОВАТЬ: Поскольку OP спросил о полных строк может быть дубликатом, поэтому позаботиться о тех, кто может попытаться выполнить следующие действия.
awk -F"[:|]" '
/^>/ !e[$0]++{
sub(/>/,"",$1)
for(i=2;i<=NF;i++){
if($i ~ /Chr/){
num=split($i,array,"[- (]")
if(!b[array[1]"("array[num-1]array[num]]++){
print array[1],array[2],array[3],$1
}
delete array
}
}
}' Input_file
1-е решение: Учитывая, что вам нужен индекс элементов, например -> Chr13,(3C->A)
и т. Д. Не могли бы вы попробовать следующее.
awk -F"[:|]" '
/^>/{
sub(/>/,"",$1)
for(i=2;i<=NF;i++){
if($i ~ /Chr/){
num=split($i,array,"[- (]")
if(!b[array[1]"("array[num-1]array[num]]++){
print array[1],array[2],array[3],$1
}
delete array
}
}
}' Input_file
Выводбудет выглядеть следующим образом.
Chr13 923456 923659 12321
Chr14 463456 463669 12321
Chr1 495831 495959 50
Chr13 363456 573659 5891
Chr14 463456 463669 5891
Chr21 139656 139690 893
2-е решение: Учитывая, что вам нужно сделать индекс, например, -> Chr13,363456,573659
десять делают следующее.
awk -F"[>:|]" ' ##Setting field separator as either > or : or | for all lines for Input_file.
NF>1 && /^>/{ ##Checking condition if NF>1 and line starts from > then do following.
for(i=3;i<=NF;i++){ ##Starting a for loop from i=3 to value of NF in current line.
if($i ~ /Chr/){ ##checking condition if field value is Chr string then only do further things.
split($i,array,"[- (]") ##Using split function to split current field value into array named array and field separators as - or space or (
val=array[1] OFS array[2] OFS array[3] ##Creating variable val whose value is arrays 1,2 and 3 values with OFS values in between them.
delete array ##Deleting this array for safer side so it shouldnot print previous values wrongly.
}
if(!a[val]++ && val){ ##For removing duplicates checking if array a index with val is there or not and val is NOT NULL then do following
print val,$2 ##Printing variable val,$2 here.
}
val="" ##Nullifying variable val here.
}
}' Input_file ##mentioning Input_file name here.