将每行最后一个数字与字母分开

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

我有一个包含临时 SNP ID 和等位基因的长文件,如下所示:

14_611646T,C
14_881226CT,C
14_861416.1GGC,GGCGCGCGCG

我想将每行的最后一个数字与字母分开(将 SNP ID 与等位基因分开)。所以看起来像这样:

14_611646 T,C
14_881226 CT,C
14_861416.1 GGC,GGCGCGCGCG

我尝试了

awk
sed
,但是,下划线不断造成问题。例如:

sed 's/^[0-9][0-9]*/& / File1 > File2

给了我

14 _611646T,C
14 _881226CT,C
14 _861416.1GGC,GGCGCGCGCGC

有人可以帮助我吗?

awk sed separator
3个回答
1
投票

尝试了解实现这一目标的最明智的方法是什么。

最好避免使用匹配所有行的正则表达式,而是尝试找到需要更改的部分。

sed
-E
又名
E
xtented
R
egex
E
表达式 :

sed -E 's/^[0-9_.]+/& /' file

产量:

14_611646 T,C
14_881226 CT,C
14_861416.1 GGC,GGCGCGCGCG

正则表达式匹配如下:

节点 说明
^
字符串锚点的开头
[0-9_.]+
任何字符:“0”到“9”、“_”、“.” (1次或多次(匹配尽可能多的数量))

sed
的替换的右侧部分中,
&
是左侧部分中匹配的内容。

奖金

sed 's/[[:upper:]]/ &/' file

[[:upper:]]
是一个
POSIX
正则表达式类,用于 所有大写字母


1
投票

sed 's/[[:alpha:]]/ &/'
在第一个非数字之前插入空格:

14_611646 T,C
14_881226 CT,C
14_861416.1 GGC,GGCGCGCGCG

1
投票

要在一行的最后一个数字和下一个非数字字符之间插入空格,可以使用

sed
,如下所示:

sed 's/\(.*[0-9]\)\([^0-9]\)/\1 \2/' file # BRE 
sed -E 's/(.*[0-9])([^0-9])/\1 \2/'  file # ERE

详情

  • \(.*[0-9]\)
    (BRE) /
    (.*[0-9])
    (ERE) - 第 1 组(替换模式中的
    \1
    指的是捕获到该组中的值):任何文本,然后是数字(行中最后一次出现)
  • \([^0-9]\)
    (BRE) /
    ([^0-9])
    (ERE) - 第 2 组(替换模式中的
    \2
    指的是捕获到该组中的值):非数字字符。

在线查看 Bash 演示

#!/bin/bash
s='14_611646T,C
14_881226CT,C
14_861416.1GGC,GGCGCGCGCG'

sed 's/\(.*[0-9]\)\([^0-9]\)/\1 \2/' <<< "$s"
sed -E 's/(.*[0-9])([^0-9])/\1 \2/' <<< "$s"

输出:

14_611646 T,C
14_881226 CT,C
14_861416.1 GGC,GGCGCGCGCG
© www.soinside.com 2019 - 2024. All rights reserved.