根据字符数将数据字段拆分为两个

时间:2013-08-16 09:24:21

标签: 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

每隔一行包含数字只能是一位或两位数的字段。有没有人有一个简单的awk解决方案去每一行,并计算每个字段中的字符,当有超过2个字符时,将字段分成两个,例如245变为24 5,2345变为23 45

5 个答案:

答案 0 :(得分:4)

这可能适合你(GNU sed):

sed '/^>/!s/\S\S\B/& /g' file

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

答案 1 :(得分:3)

sed one-liner可以做到这一点

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

测试

kent$  echo ">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"|sed -r 's/([0-9]{2})([0-9]+)/\1 \2/g'
>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

答案 2 :(得分:2)

@Kent几乎就在那里,但他的解决方案在两种情况下失败了。如果标题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

答案 3 :(得分:2)

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

awk '!/^>/{for (i=1; i<=NF; i++) do {printf "%s ", substr($i,0,2); $i=substr($i,3)} while ($i != ""); print "" }/^>/' file

或以更易读的格式:

awk '
    !/^>/{
        for (i=1; i<=NF; i++) 
            do {
                printf "%s ", substr($i,0,2); 
                $i=substr($i,3)
            } while ($i != ""); 
        print "" 
    }
    /^>/
' file

答案 4 :(得分:0)

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