Staphylococcus_sp_HMSC14C01-KV792037.1:0.00371647154267842634,Staphylococcus_hominis_VCU122-AHLD01000058.1:0.00124439639436691308)69:0.00227646100249620856,(Staphylococcus_sp_HMSC072E01-KV814990.1:0.00288325234399461859,(((Staphylococcus_hominis_793_SHAE-JUSR01000051.1:0.00594391769091206796,Staphylococcus_pettenkoferi_1286_SHAE-JVVL01000037.1:0.00594050248317441135)
逗号分隔不同的项目,在每个项目中,我想删除 之间的所有内容(包括)-
,但保留.:
-
:
我怎样才能做到这一点?所以它应该看起来像:
Staphylococcus_sp_HMSC14C01:0.00371647154267842634,Staphylococcus_hominis_VCU122:0.00124439639436691308)69:0.00227646100249620856
我使用过sed 's/-.*://' 1.file > 2.file
,但最终删除了整个文件,只保留了第一个和最后一个值。
答案1
.*
是一个贪婪的正则表达式,匹配最长可能的匹配。您需要匹配最短的匹配,但在整行上全局匹配它。尝试
sed 's/-[^:-]*:/:/g' 1.file > 2.file
字符类[^:-]
匹配任何内容除了冒号和破折号(也许它应该只匹配除冒号之外的任何内容),因此正则表达式表示“破折号后跟任意数量的非破折号、非冒号字符,后跟冒号”。然后它用冒号替换它(因为你想保留它)并g
在行上进行全局替换(尾随)。如果省略g
,则仅替换第一个实例。
答案2
awk解决方案:
awk -F',' '{ for(i=1;i<=NF;i++) sub(/-[^:-]+/,"",$i) }1' OFS=',' 1.file
-F','
- 字段分隔符for(i=1;i<=NF;i++)
- 遍历记录的所有字段sub(/-[^:-]+/,"",$i
- 替换所需的序列(之间-和:包括-但保留:)
输出:
Staphylococcus_sp_HMSC14C01:0.00371647154267842634,Staphylococcus_hominis_VCU122:0.00124439639436691308)69:0.00227646100249620856,(Staphylococcus_sp_HMSC072E01:0.00288325234399461859,(((Staphylococcus_hominis_793_SHAE:0.00594391769091206796,Staphylococcus_pettenkoferi_1286_SHAE:0.00594050248317441135)