Использование регулярного выражения для поддержания части информации в столбце - PullRequest
0 голосов
/ 17 декабря 2018

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

file.txt

G05829  H05037  A   A*02:01:01  A*11:01:01
G05829  H05037  DRA DRA*01:01:01    DRA*01:02:02
G05829  H05037  DPB1    DPB1*04:01:01   DPB1*04:02:01
G05829  H05037  DRB3    DRB3*01:01:02   DRB3*01:01:02
G05829  H05037  B   B*08:01 B*44:02
G05829  H05037  DRB1    DRB1*03:01:01   DRB1*04:01:01
G15526  H12517  B   B*07:02 B*35:01
G15526  H12517  DRB5    DRB5*01:01:01   DRB5*01:01:01
G15526  H12517  DRA DRA*01:02:03    DRA*01:02:03

Мне нужно иметь столбцы 4 и 5 в формате

A*01:01  A*01:01
DRA*01:01 DRA*01:01
(...)

Итак, первые буквы, которые идентифицируютлокус, звезда, 2 цифры, столбец и 2 две цифры.

Моя проблема в том, что не все столбцы имеют одинаковую длину.Некоторые из них будут более подробными и будут иметь 2 или 3 двоеточия (например, DPB1 * 01: 02: 02 или DQB1 * 49: 34: 01: 03), в то время как другие будут иметь только одно двоеточие (предполагаемый вывод, например, DPA * 01: 01).

Я пробовал несколько разных подходов, но я могу обрезать только с конца (что не работает, потому что они имеют разную длину), обрезать с начала (Alsop не работает, потому что первый идентификатор можетбыть 1 буквой или 3 буквами и цифрой (например, идентификатор может быть 'A' или 'DPB1'). Я пытался с sed, в итоге я заменил все двоеточия. Мои попытки:

sed 's/\:[0-9][0-9]//g' file.txt 

Этообрезает все двоеточия + цифры НЕПРАВИЛЬНО

sed 's/\:[0-9][0-9]\:[0-9][0-9]\t/\t/g' file.txt 

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

Мне нужно что-то, что будет:

распознает идентификатор (A, B, C, DPA1, DQB1), звездочку (*), числа после начала (01,02,13 (..)), первое двоеточие (:) и следующие цифры перед следующимстолбец (01,02,03 ...)

, поэтому желаемый результат будет выглядеть примерно так:это:

niceoutput.txt

G05829  H05037  A   A*02:01 A*11:01
G05829  H05037  DRA DRA*01:01   DRA*01:02
G05829  H05037  DPB1    DPB1*04:01  DPB1*04:02
G05829  H05037  DRB3    DRB3*01:01  DRB3*01:01
G05829  H05037  DRB1    DRB1*03:01  DRB1*04:01
G05829  H05037  B   B*08:01 B*44:02
G15526  H12517  B   B*07:02 B*35:01
G15526  H12517  DRB5    DRB5*01:01  DRB5*01:01
G15526  H12517  DRA DRA*01:02   DRA*01:02

спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

Этот седь даст вам желаемый результат:

sed 's/\([A-Z]\{1,\}[0-9]*\*[0-9][0-9]:[0-9][0-9]\):[0-9][0-9]/\1/g'

Тест:

$ sed 's/\([A-Z]\{1,\}[0-9]*\*[0-9][0-9]:[0-9][0-9]\):[0-9][0-9]/\1/g' file.txt > niceoutput.txt
$ cat niceoutput.txt
    G05829  H05037  A   A*02:01  A*11:01
    G05829  H05037  DRA DRA*01:01    DRA*01:02
    G05829  H05037  DPB1    DPB1*04:01   DPB1*04:02
    G05829  H05037  DRB3    DRB3*01:01   DRB3*01:01
    G05829  H05037  B   B*08:01 B*44:02
    G05829  H05037  DRB1    DRB1*03:01   DRB1*04:01
    G15526  H12517  B   B*07:02 B*35:01
    G15526  H12517  DRB5    DRB5*01:01   DRB5*01:01
    G15526  H12517  DRA DRA*01:02    DRA*01:02

Однако в своем вопросе вы упоминаете, что деталь :[0-9] может быть n раз, ноУ вас нет этого тестового примера в вашем примере, если это так, вам нужно изменить sed на:

sed 's/\([A-Z]\{1,\}[0-9]*\*[0-9][0-9]:[0-9][0-9]\)\(:[0-9][0-9]\)*/\1/g'

Test2:

$ cat jose_testcase2.txt
DPB1*01:02:02 or DQB1*49:34:01:03
DXX*05:05

$ sed 's/\([A-Z]\{1,\}[0-9]*\*[0-9][0-9]:[0-9][0-9]\)\(:[0-9][0-9]\)*/\1/g' jose_testcase2.txt
DPB1*01:02 or DQB1*49:34
DXX*05:05
...