Bash:sed命令的复杂示例

m93*_*m93 1 bash replace sed

我有一个看起来像这样的文件有2列(空格分隔):

chr1.21.imputed_info:1   100880328
chr1.31.imputed_info:1   10566215
chr1.23.imputed_info:--- 110198129
chr1.23.imputed_info:--- 114445880
chr1.24.imputed_info:--- 118141492
chr1.25.imputed_info:--- 120257110
chr1.25.imputed_info:1   121280613
chr1.30.imputed_info:--- 121287994
chr1.30.imputed_info:--- 145604302
Run Code Online (Sandbox Code Playgroud)

我想提取"chr"后面的数字,它来自1-22和第二列.所以我的输出看起来像这样:

    1 100880328
    1 10566215
    1 110198129
    1 114445880
    1 118141492
    1 120257110
    1 121280613
    1 121287994
    1 145604302
Run Code Online (Sandbox Code Playgroud)

一些重要的考虑因素:

  • 正如我所说,"chr"之后的数字从1-22开始,所以它可能是chr1,chr2 ...... chr22.
  • chr1,chr2等之后的数字可能会超过50.所以你可以得到chr1.50,或者chr2.45等

  • column1末尾的"info:"部分可能看起来像信息:1,信息:2 ..信息:22或信息:---

我在Bash中想出了这个:

cat file.txt | sed 's/chr//g' | sed 's/.imputed_info://g'
Run Code Online (Sandbox Code Playgroud)

这让我非常接近,但它做到了这一点:

1.211    100880328
1.31     10566215
1.23---  110198129
1.23---  114445880
1.24---  118141492
1.25---  120257110
1.251    121280613
1.25---  121287994
1.30---  145604302
1.301    149906413
Run Code Online (Sandbox Code Playgroud)

我知道有很多方法可以在R和Python中做到这一点,但我应该说这是一个巨大的文件,所以通过Bash会节省很多时间..所以,如果有人有一个很好的(和理想的清洁解决方案 - 我确实认识到我的sed命令有点难看)它会很棒.谢谢.

Bet*_*eta 5

更短的方式:

sed 's/^chr//;s/\..* / /' filename
Run Code Online (Sandbox Code Playgroud)

编辑:
翻译:删除领先的"chr"(如果它在那里),并替换第一个'.'的所有内容.使用单个空格到最后一个空格(即'.'后跟任何内容,后跟'').