Разбор на месте с использованием регулярных выражений в bash - PullRequest
1 голос
/ 22 мая 2019

Я бы хотел разобрать строки в 4-м столбце и при удалении ненужных символов переписать результаты в том же столбце.

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

Y   12914512    12914512    C/0.214286  A
Y   12914721    12914721    C/0.642857  T
Y   13355944    13355944    A/0.642857  G
Y   13414871    13414871    C/0.642857  T
Y   13470103    13470103    G/0.214286  A
Y   13479657    13479657    G/0.642857  C
Y   14824110    14824110    T/0.933333  *
Y   14824111    14824111    A/0.933333  *
Y   14840785    14840785    C/0.690476  T
Y   14840887    14840887    C/0.933333  T
Y   19705901    19705901    A/0.272727  G
Y   19731995    19731995    A/0.928571  C
Y   19735493    19735493    T/0.928571  C
Y   20587967    20587967    A/0.642857  C
Y   20756691    20756691    C/0.642857  T
Y   21904151    21904151    G/0.9375    A

Я хотел бы удалить все завершающие символы после "/" в четвертом столбце и заменить его значениями в пятом столбце, чтобы мой измененный текст выглядел следующим образом:

Y   12840422    12840422    G/A
Y   12914512    12914512    C/A
Y   12914721    12914721    C/T
Y   13355944    13355944    A/G

Я пришел с кодом ниже, но он не дает того, что я ожидаю:

awk -F ":" '{print $1"/"$2}' myTEXT.txt | sed 's/\([^/]*\)\{4\}$//'

Ответы [ 3 ]

3 голосов
/ 22 мая 2019

другой (игра в гольф) awk

$ awk '{k=$NF;sub("/.*","/"k)}1' file

Y   12914512    12914512    C/A
Y   12914721    12914721    C/T
Y   13355944    13355944    A/G
Y   13414871    13414871    C/T
Y   13470103    13470103    G/A
Y   13479657    13479657    G/C
Y   14824110    14824110    T/*
Y   14824111    14824111    A/*
Y   14840785    14840785    C/T
Y   14840887    14840887    C/T
Y   19705901    19705901    A/G
Y   19731995    19731995    A/C
Y   19735493    19735493    T/C
Y   20587967    20587967    A/C
Y   20756691    20756691    C/T
Y   21904151    21904151    G/A

может быть проще с sed

$ sed -E 's /.*(.) /\1 ' file
2 голосов
/ 23 мая 2019

С GNU sed для редактирования "на месте" и \s сокращением:

sed -i 's:/.*\s:/:' file

или с GNU awk для того же:

awk -i inplace '{sub(/\/.*\s/,"/")}1' file

В любом случае входной файл становится:

$ cat file
Y   12914512    12914512    C/A
Y   12914721    12914721    C/T
Y   13355944    13355944    A/G
Y   13414871    13414871    C/T
Y   13470103    13470103    G/A
Y   13479657    13479657    G/C
Y   14824110    14824110    T/*
Y   14824111    14824111    A/*
Y   14840785    14840785    C/T
Y   14840887    14840887    C/T
Y   19705901    19705901    A/G
Y   19731995    19731995    A/C
Y   19735493    19735493    T/C
Y   20587967    20587967    A/C
Y   20756691    20756691    C/T
Y   21904151    21904151    G/A
1 голос
/ 22 мая 2019

Вы можете использовать

awk '{sub(/[^\/]*$/, "", $4); print $1,$2,$3,$4$5}' file > newfile

См. Демо awk онлайн .

Подробности

  • sub(/[^\/]*$/, "", $4) удаляет все символы кроме / в конце поля 4
  • print $1,$2,$3,$4$5 печатает поля 1, 2, 3, а затем объединяет то, что осталось от поля 4 и поля 5.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...