0

我的问题是:

我的数据如下所示:

>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

4

5 回答 5

4

这可能对您有用(GNU sed):

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

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

于 2013-08-16T14:35:28.247 回答
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
于 2013-08-16T09:31:19.997 回答
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
于 2013-08-16T09:42:42.657 回答
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
于 2013-08-16T09:44:06.757 回答
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
于 2013-08-19T17:50:14.720 回答