如何在linux中使用sed或awk在负数或正数小数前添加空格

问题描述 投票:0回答:2

我有一个如下所示的文件:

GENERSID1RSID2VALUE
ENSG00000242220rs2826052rs28260520.20961262553802
ENSG00000242220rs2826052rs798932040.00583452893352463
ENSG00000242220rs2826052rs117256228-0.003012912482066

我想在每个值之间添加空格,因此它应该看起来像:

GENE RSID1 RSID2 VALUE
ENSG00000242220 rs2826052 rs2826052 0.20961262553802
ENSG00000242220 rs2826052 rs79893204 0.00583452893352463
ENSG00000242220 rs2826052 rs117256228 -0.003012912482066

我在 sed 中使用了这个命令,我能够做到这一点:

sed“s/rs/ &/g” Model_training_chr21_covariances.txt > Model_training_chr21_covariances1.txt

sed“s/-0/ &/” Model_training_chr21_covariances1.txt > Model_training_chr21_covariances2.txt

ENSG00000242220 rs2826052 rs28260520.20961262553802
ENSG00000242220 rs2826052 rs798932040.00583452893352463
ENSG00000242220 rs2826052 rs117256228 -0.003012912482066

基本上负数-0.003现在已经分开了,但是0.209和0.0058没有分开,我只能在-0之前添加空格。值而不是 0。? 有什么办法可以解决这个问题吗? 谢谢你

linux bash awk sed data-manipulation
2个回答
0
投票

您可以将所有正则表达式合并到一个 sed 命令中以节省一些处理时间。

sed -e 's/rs/ &/g' -e 's/-*0\./ &/' \
    Model_training_chr21_covariances.txt \
    > Model_training_chr21_covariances1.txt

-*  0 or more - characters 
0   a literal '0' 
\.  a literal '.'

0
投票

假设:

  • 第二个和第三个字段 始终 以字母
    rs
  • 开头
  • 字母
    rs
    不会出现在数据中的其他任何位置(除了第二/第三字段的前两个字符)
  • 第四个字段始终以(可选
    -
    )+
    0.
  • 开头

调整和组合 OP 的

sed
脚本:

$ sed 's/rs/ &/g; s/[-]*.[.]/ &/g' sample.txt
GENERSID1RSID2VALUE
ENSG00000242220 rs2826052 rs2826052 0.20961262553802
ENSG00000242220 rs2826052 rs79893204 0.00583452893352463
ENSG00000242220 rs2826052 rs117256228 -0.003012912482066
© www.soinside.com 2019 - 2024. All rights reserved.