早上好,我有一个看起来像这样的文件:
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位两位数字。
我的问题是,不是eery列具有相同的长度。一些将更详细,将具有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
谢谢!
答案 0 :(得分:1)
此sed将为您提供所需的输出:
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