使用正则表达式维护列的部分信息

Using regular expression to maintain part of information on column

早上好,我有一个如下所示的文件:

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 不起作用,因为第一个标识符可以是一个字母或 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

谢谢!

这个 sed 会给你你想要的输出:

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

测试:

$ sed 's/\([A-Z]\{1,\}[0-9]*\*[0-9][0-9]:[0-9][0-9]\):[0-9][0-9]//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]\)*//g'

测试 2:

$ 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]\)*//g' jose_testcase2.txt
DPB1*01:02 or DQB1*49:34
DXX*05:05