给定一个文件名,chrIII:834297-835206:-.miRanda.txt
我想生成一个最小的床格式(制表符分隔的数据):
chrIII 834297 835206 -
我很难告诉sed
只转换-
整数后面的第一个分隔符(即不要弄乱第二次出现的链信息)。我的尝试echo *.miRanda.txt | sed 's/.miRanda.txt//g' | sed 's/:/\t/g; s/[0-9]-/\t/g'
是不正确的,如果有人可以提供帮助,我将不胜感激(我怀疑我必须围绕[0-9]
某种模式,但我在不知道术语的情况下努力用谷歌搜索这个)。
解决方案并不一定是需求sed
。
答案1
这是一种方法(使用 GNUsed
或任何其他支持的方法-E
):
$ echo chrIII:834297-835206:-.miRanda.txt |
sed -E 's/^(chr[^:]+):([0-9]+)-([0-9]+):([^.]+).*/\1\t\2\t\3\t\4/'
chrIII 834297 835206 -
请注意,这假设您永远不能将 a.
作为第四个字段(床文件中的名称)。如果这不是一个安全的假设并且您需要使用扩展,您可以这样做:
$ echo chrIII:834297-835206:-.miRanda.txt |
sed -E 's/^(chr[^:]+):([0-9]+)-([0-9]+):(.+)\.miRanda.txt/\1\t\2\t\3\t\4/'
chrIII 834297 835206 -
另请注意,最小床格式根本不需要第四个字段。这是一个有效的床文件:
chrIII 834297 835206
最后,你的方法是几乎在那里,尽管比严格需要的稍微复杂一些。您从开始位置删除了最后一个整数,因为它用制表s/[0-9]-/\1\t/
符替换了数字和。-
这与您的命令基本上相同,只是稍微调整以解决此问题并删除不必要的g
全局运算符:
$ echo chrIII:834297-835206:-.miRanda.txt |
sed 's/\.miRanda.txt//' |
sed -E 's/:/\t/g; s/([0-9])-/\1\t/'
chrIII 834297 835206 -
我不知道你为什么说这对你来说失败了。