我的问题是:
我的数据如下:
>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
答案 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