Sed 基于字符计数将数据字段一分为二

Sed 基于字符计数将数据字段一分为二,sed,awk,Sed,Awk,我的问题是: 我有如下数据: >header_GH_X 12 15 53 43 23 25 45 56 4544 32 3 42 53 >header2 15 34 155 6 54 7 66 8888 23 12 23 45 >header_GH_Y 12 15 53 43 23 25 45 56 45 44 32 3 42 53 >header2 15 34 15 5 6 54 7 66 88 88 23 12 23 45 但它应该是这样的: >header

我的问题是:

我有如下数据:

>header_GH_X
12 15 53 43 23 25 45 56 4544 32 3 42 53
>header2
15 34 155 6 54 7 66 8888 23 12 23 45
>header_GH_Y
12 15 53 43 23 25 45 56 45 44 32 3 42 53
>header2
15 34 15 5 6 54 7 66 88 88 23 12 23 45
但它应该是这样的:

>header_GH_X
12 15 53 43 23 25 45 56 4544 32 3 42 53
>header2
15 34 155 6 54 7 66 8888 23 12 23 45
>header_GH_Y
12 15 53 43 23 25 45 56 45 44 32 3 42 53
>header2
15 34 15 5 6 54 7 66 88 88 23 12 23 45

每第二行由数字只能为一位或两位的字段组成。是否有人有一个简单的awk解决方案,可以转到第二行,并计算每个字段中的字符数,当字符数超过2个时,将字段拆分为两个,例如245变为24 5,2345变为23 45

sed -r 's/([0-9]{2})([0-9]+)/\1 \2/g'
试验

几乎就要到了,但他的解决方案在两个案例中失败了。如果标题ID大于2位,则会将其拆分,对于大于4位的数字,不会将其拆分为2组。例如,将以下内容作为输入文件:

$ cat file
>header_GH_X
12 15 53 43 23 25 45 56 4544 32 3 42 53
>header2
15 34 155 6 54 7 66 8888 23 12 23 45
>header102
15 34 155 6 54 7 66 88888888 23 12 23 45
通过一些小的更改,这很容易修复:

$ sed -r ':a;2~2s/([0-9]{2})([0-9]+)/\1 \2/g;ta' file
>header_GH_X
12 15 53 43 23 25 45 56 45 44 32 3 42 53
>header2
15 34 15 5 6 54 7 66 88 88 23 12 23 45
>header102
15 34 15 5 6 54 7 66 88 88 88 88 23 12 23 45

这是一个awk解决方案(因为问题被标记为awk):

awk'!/^>/{for(i=1;i/'文件
或以更可读的格式:

awk '
    !/^>/{
        for (i=1; i<=NF; i++) 
            do {
                printf "%s ", substr($i,0,2); 
                $i=substr($i,3)
            } while ($i != ""); 
        print "" 
    }
    /^>/
' file
awk'
!/^>/{
对于(i=1;i/
"档案"
这可能适合您(GNU-sed):

对于所有不以
开头的行,在单词中的两个非空格后添加空格。

awk

awk '/^[0-9]/ {gsub(/[0-9][0-9]/,"& ");$1=$1}1' file
>header_GH_X
12 15 53 43 23 25 45 56 45 44 32 3 42 53
>header2
15 34 15 5 6 54 7 66 88 88 23 12 23 45

这项工作做得很好。谢谢。@user1308144您确定吗?您的输入是否包含超过4位的数字,标题的数量是否可以超过100?@sudo_O在这种情况下,标题永远不会超过4位。在这种情况下,标题也不会导致问题(遵循示例中第一个标题的样式),但感谢您指出这一点,因为在按顺序编号的标头的情况下,这会导致问题。
awk '/^[0-9]/ {gsub(/[0-9][0-9]/,"& ");$1=$1}1' file
>header_GH_X
12 15 53 43 23 25 45 56 45 44 32 3 42 53
>header2
15 34 15 5 6 54 7 66 88 88 23 12 23 45