regex - 使用正则表达式维护列上的部分信息
问题描述
早上好,我有一个看起来像这样的文件:
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 )。
我尝试了一些不同的方法,但我只能从最后裁剪(什么不起作用,因为它们的长度不同),从头开始裁剪(也不起作用,因为第一个标识符可以是 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
谢谢你!
解决方案
这个 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'
测试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]\)*/\1/g' jose_testcase2.txt
DPB1*01:02 or DQB1*49:34
DXX*05:05
推荐阅读
- javascript - POST Discord 消息嵌入
- php - 已打开/已完成工单相对于总工单的进度条
- ruby-on-rails - 编写 RSpec 测试以在端口 3000 上访问另一个 Rails 应用程序
- android - 在 gradle 中包含播放服务时,所有 com.android.libraries 支持必须使用相同的版本
- c++ - 使用 ifstream 无法打开文本文件
- css - CSS shadow dom:是否有 /deep 选择器的替代品?
- javascript - 无法读取未定义的属性“管道”
- php - 过滤Mysql中的数据
- python - 将具有元组列表的列转换为多列
- amazon-dynamodb - DynamoDB - 逐一扫描(如 JDBC 游标)