Как удалить запятую и распечатать всю строку снова для слов, которые помещаются после запятой

Файл:

chr1_156186369 chr1_156186369_A_C,TAC,T 33150.29 1/2:0,4,6:10:88:272 chr19_27732257 chr19_27732257_G_C GC 262.29 1/2:1,10,7:18:99:414,167 chrM_2619 chrM_2619_A_G,TAG,T 33023.29 1/2:0,5,5:10:99:293,144,129 chr9_119375271 chr9_119375271_T_A,GTA,G 248.29 1/2:1,11,5:17:99:359,107,113 

Мне нужно удалить запятую только из столбцов 2 и 4 и напечатать всю строку для слов, которые находятся после запятой.

Ожидаемый результат:

 chr1_156186369 chr1_156186369_A_C AC 33150.29 1/2:0,4,6:10:88:272 chr1_156186369 chr1_156186369_A_T AT 33150.29 1/2:0,4,6:10:88:272 chr19_27732257 chr19_27732257_G_C GC 262.29 1/2:1,10,7:18:99:414,167 chrM_2619 chrM_2619_A_G AG 33023.29 1/2:0,5,5:10:99:293,144,129 chrM_2619 chrM_2619_A_T AT 33023.29 1/2:0,5,5:10:99:293,144,129 chr9_119375271 chr9_119375271_T_A TA 248.29 1/2:1,11,5:17:99:359,107,113 chr9_119375271 chr9_119375271_T_G TG 248.29 1/2:1,11,5:17:99:359,107,113 

Я попробовал awk, но не получил никакого результата, также прочитал аналогичный вопрос здесь. Как извлечь строку из файла при определенном условии

  • Замена обратной косой черты запятыми в Bash
  • Удалить последнюю запятую из строки bash для созданной петли строки
  • разделить большой файл на новый файл с уникальными именами файлов
  • sed regex для группы захвата между разделителями
  • Awk - держите слово «пример» и «ПРИМЕР» с одним входом
  • Удаление строк, содержащих указанную строку в разных файлах
  • добавление букв и символов в столбец с помощью awk или sed?
  • Удалите строку из определенного поля с помощью awk / sed
  • 4 Solutions collect form web for “Как удалить запятую и распечатать всю строку снова для слов, которые помещаются после запятой”

    Я не знаю, как это сделать с помощью одной команды, но она работает с этим циклом в bash :

     cat data.dat | while read line do if echo "${line}" | grep -q '[[:alpha:]],[[:alpha:]]' then letters=`echo "${line}" | grep -o '[[:alpha:]],[[:alpha:]]' | head -n 1` for letter in `echo ${letters} | sed 's/,/ /g'` do echo "${line}" | sed 's/'"${letters}"'/'"${letter}"' /g' done else echo "${line}" fi done 

    Использование awk:

     awk '{ split ($2,w2,","); split ($4,w4,","); for (i in w4) { print $1,substr(w2[1],0,length(w2[1])-length(w4[i])) w4[i],$3,w4[i],$5,$6; }}' 

    Обратите внимание, что обработка ошибок не выполняется, если значения после запятой не равны для столбцов 2 и 4.

    С sed предполагающим, что отдельные значения, разделенные символом, такие как C,T , повторяются

     $ sed -E 's/^(.*)([AZ]),([AZ])(.*)\2,\3(.*)/\1\2\4\2\5\n\1\3\4\3\5/' ip.txt chr1_156186369 chr1_156186369_A_C AC 33150.29 1/2:0,4,6:10:88:272 chr1_156186369 chr1_156186369_A_T AT 33150.29 1/2:0,4,6:10:88:272 chr19_27732257 chr19_27732257_G_C GC 262.29 1/2:1,10,7:18:99:414,167 chrM_2619 chrM_2619_A_G AG 33023.29 1/2:0,5,5:10:99:293,144,129 chrM_2619 chrM_2619_A_T AT 33023.29 1/2:0,5,5:10:99:293,144,129 chr9_119375271 chr9_119375271_T_A TA 248.29 1/2:1,11,5:17:99:359,107,113 chr9_119375271 chr9_119375271_T_G TG 248.29 1/2:1,11,5:17:99:359,107,113 
    • ^(.*) начало текста
    • ([AZ]),([AZ]) разделенные запятыми отдельные символы
    • (.*) текст между повторением
    • \2,\3 снова совпадают с отдельными символами, разделенными запятой
    • (.*) остальная часть строки
    • \1\2\4\2\5\n\1\3\4\3\5 требуемый формат вывода
    • Обратите внимание, что интервал точно не соответствует ожидаемому результату

    Разделите 4-е поле в запятой и используйте срезы в этом столбце, а также замените последние _X,Y на _slice , если они есть:

     awk '{ n=split($4,slices,",") for(i=1;i<=n;i++) { res=$2 sub(/.,.*/,slices[i],res) print $1, res, $3, slices[i], $5, $6 } }' file 

    Мне не очень нравится, как я печатаю поля, так как я указываю с 1-го по 6-й, так что, надеюсь, это статично.

     $ awk '{n=split($4,slices,","); for(i=1;i<=n;i++) {res=$2; sub(/.,.*/,slices[i],res); print $1, res, $3, slices[i], $5, $6}}' a chr1_156186369 chr1_156186369_A_C AC 33150.29 1/2:0,4,6:10:88:272 chr1_156186369 chr1_156186369_A_T AT 33150.29 1/2:0,4,6:10:88:272 chr19_27732257 chr19_27732257_G_C GC 262.29 1/2:1,10,7:18:99:414,167 chrM_2619 chrM_2619_A_G AG 33023.29 1/2:0,5,5:10:99:293,144,129 chrM_2619 chrM_2619_A_T AT 33023.29 1/2:0,5,5:10:99:293,144,129 chr9_119375271 chr9_119375271_T_A TA 248.29 1/2:1,11,5:17:99:359,107,113 chr9_119375271 chr9_119375271_T_G TG 248.29 1/2:1,11,5:17:99:359,107,113 
    Linux и Unix - лучшая ОС в мире.