Как заменить соответствующий шаблон началом строки, используя sed? - PullRequest
1 голос
/ 28 июня 2019

У меня есть файл, похожий на этот:

254529  ANN=C|blabla,T|blabla,A|blabla
254540  ANN=T|blabla,G|blabla,C|blabla
254586  ANN=TTGG|blabla,A|blabla

Я хочу заменить запятые в моем файле запятыми, за которыми следует номер в начале строки.

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

Я пробовал следующее, но оно заменяет только последнюю запятую в строке.

sed -e 's/^\(.*\)\(\t.*\),/\1\2,\1\t/g' file

Вот что я получаю:

254529  ANN=C|blabla,T|blabla,254529    A|blabla
254540  ANN=T|blabla,G|blabla,254540    C|blabla
254586  ANN=TTGG|blabla,254586  A|blabla

Хотелось бы получить вот это:

254529  ANN=C|blabla,254529    T|blabla,254529    A|blabla
254540  ANN=T|blabla,254540    G|blabla,254540    C|blabla
254586  ANN=TTGG|blabla,254586  A|blabla

Это выполнимо с помощью sed?

Спасибо

1 Ответ

0 голосов
/ 28 июня 2019

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

Проблема в том, что g для глобальной замены не выполняет перекрывающихся замен.Простое решение - повторять замены столько раз, сколько запятых.Как это:

$ sed ':a; s/^\(.*\)\(\t.*\),/\1\2\n\1\t/; ta; s/\n/,/g' file
254529  ANN=C|blabla,254529     T|blabla,254529 A|blabla
254540  ANN=T|blabla,254540     G|blabla,254540 C|blabla
254586  ANN=TTGG|blabla,254586  A|blabla

Как это работает:

  • :a

    Это создает метку a.

  • s/^\(.*\)\(\t.*\),/\1\2\n\1\t/

    Это выполняет вашу замену (слегка измененная).* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * [*] [10] * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 * * * * * *)): Будет сопоставлена ​​только последняя запятая, и будет выполнена только одна подстановка.

    Единственное отличие от вашей команды состоит в том, что в выходных данных запятая заменяется новой строкой.Это делается для того, чтобы мы не пытались повторить подстановку на той же запятой снова.

  • ta

    Если последняя подстановка прошла успешно, перейдите назадпометить a.

  • s/\n/,/g

    Преобразовать все символы новой строки обратно в запятую.

Используя awk

$ awk -F'\t' '{gsub(/,/, ","$1"\t")} 1' file
254529  ANN=C|blabla,254529     T|blabla,254529 A|blabla
254540  ANN=T|blabla,254540     G|blabla,254540 C|blabla
254586  ANN=TTGG|blabla,254586  A|blabla
...