2013-08-16 78 views
0

我的问题是:分裂根据charatcer数据字段分为两个算

我有数据,看起来像这样:

>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

回答

3

一个sed的一行能做到这一点

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 
+0

这完全做的工作。谢谢。 – user1308144

+0

@ user1308144你确定吗?您的输入是否可以包含超过4位数字的数字,头部数量是否可以超过100? –

+0

@sudo_O在这种情况下,它永远不会超过4位数。在这种情况下,头文件也不会引起问题(在示例中遵循第一个头文件的样式),但是感谢您指出它,因为在顺序编号的头文件中会导致问题。 – user1308144

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 
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

这可能为你工作(GNU SED):

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

对于不具有>开始后一个字内的2个非空间添加一个空格行。

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