Как вернуть определенные части строки символов из каждой строки?
У меня есть файл (генкод.вм23.расшифровки.fa), который содержит много строк, имеющих несколько идентификаторов для гена, а также последовательность. Каждая строка начинается с >, чтобы представить новый ген
Я хочу создать новый файл, который содержит только первую часть информации >ENSMUST00000193812. 1, а также всю последовательность ДНК. А затем сделайте это для всех строк, которые начинаются с">". мне трудно понять, как это сделать. Любая помощь очень ценится
ENSMUST00000193812.1|ENSMUSG00000102693.1|OTTMUSG00000049935.1|OTTMUST00000127109.1|4933401J01Rik-201|4933401J01Rik|1070|TEC| AAGGAAAGAGGATAACACTTGAAATGTAAATAAAGAAAATACCTAATAAAAATAAATAA AACATGCTTTCAAAGGAAATAAAAAGTTGGATTCAAAAATTTAACTTTGCTCATTTGGT ATAATCAAGGAAAAGACCTTTGCATATAAAATATTTTGAATAAAATTCAGTGGAAGAA TGGAATAGAAATATAAGTTTAATGCTAAGTATAAGTACCAGTAAAAGAATAAAAAGA AATATAAGTTGGGTATACAGTTATTTGCCAGCACAAAGCCTTGGGTATGGTTCTTAGCAC TAAGGAACCAGCCAAATCACCAACAAACAGAGGCATAAGGTTTTAGTGTTTACTATTTGT ACTTTTTGTGGATCATTCTTGCCAGCCTGTAGTGCAACCATCTCTAATCCACCACCATGAAG GGAACTGTGATAATTCACTGGGCTTTTTCTGTGCAAGATGAAAAAAAGCCAGGTGAGGCT GATTTATGAGTAAGGGATGTGCATTCCTAACTCAAAAATCTGAAATTTGAAATGCCCCC


Ответы - Как вернуть определенные части строки символов из каждой строки? / How do I return specific parts of a string of characters from every row?


08.02.2020 05:17:47
Это зависит от того, содержит ли ваш файл данных ' '
, постоянным для каждой строки. Учитывая, что некоторые из ваших полей имеют пробел послеawk -F '|' ' {
for (i=1; i<=NF; i++)
if ($i ~ /^>ENSMUST/) # remove the '>' if not actually in file
printf "%s|", $1
else if (match($i,/[^ACGT]/)==0) {
print $i
break
}
}' infile > newoutfile
, а другие-нет, похоже, что пробелы являются результатом вставки длинной строки в ваш вопрос.
Если количество полей постоянно для каждой строки
Если у вас есть одинаковое количество полей и разделителей ( awk -F '|' ' {
for (i=1; i<=NF; i++)
if ($i ~ /^>ENSMUST/) # remove the '>' if not actually in file
printf "%s|", $1
else if (match($i,/[^ACGT]/)==0) {
print $i
break
}
}' infile > newoutfile
) в каждой строке, awk -F '|' ' {
for (i=1; i<=NF; i++)
if ($i ~ /^>ENSMUST/) # remove the '>' if not actually in file
printf "%s|", $1
else if (match($i,/[^ACGT]/)==0) {
print $i
break
}
}' infile > newoutfile
(или с awk
если "ENSMUST..."
включено в файл) и 9-е поле-это ваша последовательность генов, то вы можете сделать:
">ENSMUST..."
Если Формат Строки Не Постоянен
Если формат строки не является постоянным по количеству полей, или поле, где один начинается с '>'
и ваша последовательность генов произойдет, вам нужно будет проверить наличие каждого и вывести поле, в котором они находятся. Одно предположение состоит в том, что поле с awk -F '|' '{print $1 "|" $9}' infile > newoutfile
происходит перед полем с вашей генной последовательностью в линии. Чтобы справиться с этим состоянием, вы могли бы сделать:
"ENSMUST..."
Выше вы просто перелистываете каждое поле до того, которое начинается с '>'
это нашли (это выход с последующим разделитель awk -F '|' ' {
for (i=1; i<=NF; i++)
if ($i ~ /^>ENSMUST/) # remove the '>' if not actually in file
printf "%s|", $1
else if (match($i,/[^ACGT]/)==0) {
print $i
break
}
}' infile > newoutfile
), а затем продолжить цикл, пока поле только символы "ENSMUST..."
не найдено (как в приведенном выше, вы проверить и отбросить любое поле, которое есть нечто иное, чем '|'
внутри нее и выход из цикла после того, как последовательности гена найден и выход.
Пример Использования / Вывода
В любом случае выше, ваш [ACGT]
будет содержать поля:
ACGT
или если "ENSMUST..."
находится в файле:
ENSMUST00000193812.1|AAGGAAAGAGGATAACACTTGAAA.....
Посмотрите все это и дайте мне знать, если это то, что вы намеревались и есть ли у вас какие-либо дополнительные вопросы.