awk для удаления текста и разделения на два разделителя - PullRequest
1 голос
/ 24 сентября 2019

Я пытаюсь использовать awk, чтобы удалить текст после последней цифры и разделить на :.Это общее для обеих строк, и я верю, что первая часть awk ниже сделает это.Если в строке нет _, то в $3 повторяется $2, и я верю, что разделение сделает это.То, что я не уверен, как это сделать, это если _ в строке, то число слева от _ равно $2, а число справа от _ равно $3.Спасибо:).

вход

chr7:140453136A>T 
chr7:140453135_140453136delCAinsTT

желаемый

chr7    140453136   140453136 
chr7    140453135   140453136

awk

awk '{sub(/[^0-9]+$/, "", $1); {split($0,a,":"); print a[1],a[2]a[2]} 1' input

Ответы [ 4 ]

2 голосов
/ 24 сентября 2019
$ awk -F'[:_]' '{print $1, $2+0, $NF+0}' file
chr7 140453136 140453136
chr7 140453135 140453136
2 голосов
/ 24 сентября 2019

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

awk -v FPAT='[0-9]+|chr[0-9]*' -v OFS='\t' 'NF==2{$3=$2}{$1=$1}1'

Это основано на шаблоне поля FPAT, который представляет собой регулярное выражение, представляющее число, или строку chr с числом.

ОператорNF==2{$3=$2} должен дублировать второе поле, если в записи только 2.

Последнее утверждение - заставить awk перестроить запись, чтобы получить желаемое форматирование.

2 голосов
/ 24 сентября 2019

Вот один из них:

$ awk '
BEGIN { 
    FS="[:_]"               # using field separation for the job
    OFS="\t"
}
{
    sub(/[^0-9]*$/,"",$NF)  # strip non-digits off the end of last field
    if(NF==2)               # if only 2 fields
        $3=$2               # make the $2 from $2
}1' file                    # output

Вывод:

chr7    140453136       140453136
chr7    140453135       140453136

Проверено на GNU awk, mawk, Busybox awk и awk версии 20121220.

1 голос
/ 24 сентября 2019

Не могли бы вы попробовать следующее, более общее решение в отношении НЕТ жесткого кодирования копирования значений полей в другие поля и т. Д., Вы можете просто указать максимальное количество значений поля в переменной awk, и он проверит каждую строку (вместе судаляя алфавиты из их значения) и будет копировать последнее значение до конца максимального значения для этой строки.

awk -F'[:_]' -v max="3" '
{
  for(i=2;i<=max;i++){
    if($i==""){
      $i=$(i-1)
    }
    gsub(/[^0-9]+/,"",$i)
  }
}
1
'   Input_file

Чтобы получить выходные данные в форме с разделителями TAB, добавьте | column -t в приведенный выше код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...