Разделение строк и сохранение начала и конца каждой новой строки - PullRequest
0 голосов
/ 09 июля 2020

У меня есть .txt с несколькими строками, которые выглядят так:

> X 147010263   SNP EXON(MODIFIER|||||FMR1||CODING|NR_033699.1|5|1),EXON(MODIFIER|||||FMR1||CODING|NR_033700.1|5|1),NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|516|FMR1||CODING|NM_001185081.1|5|1),NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|537|FMR1||CODING|NM_001185075.1|5|1),NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|586|FMR1||CODING|NM_001185082.1|5|1),NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|611|FMR1||CODING|NM_001185076.1|5|1),NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|632|FMR1||CODING|NM_002024.5|5|1) NA  11161.p1    NA  A/A 77  A/A 87  A/C 97  A/C 0
> X 147010263   SNP EXON(MODIFIER|||||FMR1||CODING|NR_033699.1|5|1),EXON(MODIFIER|||||FMR1||CODING|NR_033700.1|5|1),NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|516|FMR1||CODING|NM_001185081.1|5|1),NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|537|FMR1||CODING|NM_001185075.1|5|1),NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|586|FMR1||CODING|NM_001185082.1|5|1),NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|611|FMR1||CODING|NM_001185076.1|5|1),NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|632|FMR1||CODING|NM_002024.5|5|1) NA  NA  13829.p1    A/A 46  A/A 83  A/C 17  A/C 0

Каждое поле разделено табуляцией, а четвертое содержит несколько данных, разделенных запятой. Я знаю, что могу разделить его на tr , '\n', дав следующее:

X   147010263   SNP EXON(MODIFIER|||||FMR1||CODING|NR_033699.1|5|1)
EXON(MODIFIER|||||FMR1||CODING|NR_033700.1|5|1)
NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|516|FMR1||CODING|NM_001185081.1|5|1)
NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|537|FMR1||CODING|NM_001185075.1|5|1)
NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|586|FMR1||CODING|NM_001185082.1|5|1)
NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|611|FMR1||CODING|NM_001185076.1|5|1)
NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|632|FMR1||CODING|NM_002024.5|5|1) NA  11161.p1    NA  A/A 77  A/A 87  A/C 97  A/C 0
X   147010263   SNP EXON(MODIFIER|||||FMR1||CODING|NR_033699.1|5|1)
EXON(MODIFIER|||||FMR1||CODING|NR_033700.1|5|1)
NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|516|FMR1||CODING|NM_001185081.1|5|1)
NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|537|FMR1||CODING|NM_001185075.1|5|1)
NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|586|FMR1||CODING|NM_001185082.1|5|1)
NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|611|FMR1||CODING|NM_001185076.1|5|1)
NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|632|FMR1||CODING|NM_002024.5|5|1) NA  NA  13829.p1    A/A 46  A/A 83  A/C 17  A/C 0

Но то, что я хотел бы, было бы следующее:

X   147010263   SNP EXON(MODIFIER|||||FMR1||CODING|NR_033699.1|5|1) NA  11161.p1    NA  A/A 77  A/A 87  A/C 97  A/C 0
X   147010263   SNP EXON(MODIFIER|||||FMR1||CODING|NR_033700.1|5|1) NA  11161.p1    NA  A/A 77  A/A 87  A/C 97  A/C 0
X   147010263   SNP NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|516|FMR1||CODING|NM_001185081.1|5|1)  NA  11161.p1    NA  A/A 77  A/A 87  A/C 97  A/C 0
X   147010263   SNP NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|537|FMR1||CODING|NM_001185075.1|5|1)  NA  11161.p1    NA  A/A 77  A/A 87  A/C 97  A/C 0
X   147010263   SNP NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|586|FMR1||CODING|NM_001185082.1|5|1)  NA  11161.p1    NA  A/A 77  A/A 87  A/C 97  A/C 0
X   147010263   SNP NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|611|FMR1||CODING|NM_001185076.1|5|1)  NA  11161.p1    NA  A/A 77  A/A 87  A/C 97  A/C 0
X   147010263   SNP NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|632|FMR1||CODING|NM_002024.5|5|1) NA  11161.p1    NA  A/A 77  A/A 87  A/C 97  A/C 0
X   147010263   SNP EXON(MODIFIER|||||FMR1||CODING|NR_033699.1|5|1) NA  NA  13829.p1    A/A 46  A/A 83  A/C 17  A/C 0
X   147010263   SNP EXON(MODIFIER|||||FMR1||CODING|NR_033700.1|5|1) NA  NA  13829.p1    A/A 46  A/A 83  A/C 17  A/C 0
X   147010263   SNP NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|516|FMR1||CODING|NM_001185081.1|5|1)  NA  NA  13829.p1    A/A 46  A/A 83  A/C 17  A/C 0
X   147010263   SNP NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|537|FMR1||CODING|NM_001185075.1|5|1)  NA  NA  13829.p1    A/A 46  A/A 83  A/C 17  A/C 0
X   147010263   SNP NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|586|FMR1||CODING|NM_001185082.1|5|1)  NA  NA  13829.p1    A/A 46  A/A 83  A/C 17  A/C 0
X   147010263   SNP NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|611|FMR1||CODING|NM_001185076.1|5|1)  NA  NA  13829.p1    A/A 46  A/A 83  A/C 17  A/C 0
X   147010263   SNP NON_SYNONYMOUS_CODING(MODERATE|MISSENSE|aaA/aaC|K119N|632|FMR1||CODING|NM_002024.5|5|1) NA  NA  13829.p1    A/A 46  A/A 83  A/C 17  A/C 0

Обратите внимание, что начало строки (X 147010263, его хромосомные позиции) также могут быть разными, например, 3 41278119, 4 114275304

Как мне этого добиться?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Решение в чистом виде bash может быть:

#!/bin/bash

while IFS=$'\t' read -r f1 f2 f3 f4 rest; do
    IFS=, read -r -a items <<< "$f4"
    for item in "${items[@]}"; do
        printf "%s\t%s\t%s\t%s\t%s\n" "$f1" "$f2" "$f3" "$item" "$rest"
    done
done < input.txt

Пояснение:

Внешний while l oop читает строки до конца -of-файла встречается. IFS=$'\t' указывает встроенной read использовать символ табуляции в качестве разделителя полей для обрабатываемой строки. Первые четыре поля назначаются переменным f1, f2, f3 и f4 соответственно. Остальные поля и промежуточные символы табуляции (если есть) назначаются переменной rest (здесь имена переменных не являются специальными. Можно использовать любое допустимое имя). Параметр -r используется во встроенной команде read, поэтому backsla sh не действует как escape-символ.

В теле while l oop встроенная read читает содержимое переменной f4, в которой хранится четвертое поле обрабатываемой строки, разбивает его на поля, используя , в качестве разделителя, и присваивает полям последовательные индексы массива items (обозначено опцией -a). Конструкция command <<< string называется here string (прочтите Here Strings в Bash Справочном руководстве ).

Внутренний for l oop (иногда называемый для каждого l oop) последовательно обрабатывает каждый элемент массива items. "${items[@]}" расширяет каждый элемент массива items в отдельное поле, и эти поля последовательно назначаются переменной item. Встроенная функция printf аналогична стандартной библиотеке C.

0 голосов
/ 09 июля 2020

Использование awk. Основываясь на , обратите внимание, что начало строки - - X 147010263 - - Я предположил, что записи не начинаются с > , как предполагают данные образца.

$ awk '
BEGIN {
    FS=OFS="\t"                                          # tab-delimitied
}
{
    n=split($4,a,/,/)                                    # split the 4th by commas
    for(i=1;i<=n;i++)                                    # for all comps of 4th
        for(j=1;j<=NF;j++)                               # and all fields
            printf "%s%s",(j==4?a[i]:$j),(j==NF?ORS:OFS) # output 
}' file

Начало вывода:

X       147010263       SNP     EXON(MODIFIER|||||FMR1||CODING|NR_033699.1|5|1) NA      11161.p1        NA      A/A     77      A/A     87      A/C     97      A/C     0
X       147010263       SNP     EXON(MODIFIER|||||FMR1||CODING|NR_033700.1|5|1) NA      11161.p1        NA      A/A     77      A/A     87      A/C     97      A/C     0
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...