我有一个看起来像这样的文件有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)
一些重要的考虑因素:
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命令有点难看)它会很棒.谢谢.
更短的方式:
sed 's/^chr//;s/\..* / /' filename
Run Code Online (Sandbox Code Playgroud)
编辑:
翻译:删除领先的"chr"(如果它在那里),并替换第一个'.'的所有内容.使用单个空格到最后一个空格(即'.'后跟任何内容,后跟'').