在字符对之间插入空格 - sed

时间:2012-08-16 10:05:12

标签: sed awk

另一个问题!我有成对的核苷酸数据

1 Affx-14150122 0 75891 00 CT TT CT TT CT 

按空格分割,我需要在每对中加一个空格,例如

1 Affx-14150122 0 75891 0 0 C T T T C T T T C T 

我已尝试sed 's/[A-Z][A-Z]/ &/g'sed 's/[A-Z][A-Z]/& /g'

并且A-Z都替换为..并且它永远不会按照我的意愿拆分它(它在前后放置空格或者拆分每对其他对或类似的!)。

4 个答案:

答案 0 :(得分:2)

我认为这对你有用,但并不完美!

echo "1 Affx-14150122 0 75891 00 CT TT CT TT CT" | \
  sed 's/\(\s[A-Z]\)\([A-Z]\)/\1 \2/g'

给出

1 Affx-14150122 0 75891 00 C T T T C T T T C T

sed 's/\(\s[A-Z]\)\([A-Z]\)/\1 \2/g'匹配空格(\s)大写字符([A-Z]),将其放在一个组(\(...\))中,然后匹配大写字符并存储在第二组。然后,此匹配由第一组(\1)空格第二组(\2)替换。

注意:
如果序列长度超过2个字符,则会失败。

答案 1 :(得分:0)

使用awk的解决方案,它只修改字符对,并且可能更强大,具体取决于您的输入数据:

echo "1 Affx-14150122 0 75891 00 CT TT CT TT CT" | \
  awk '
    {
      for(i=1;i<=NF;i++) {
        if($i ~ /^[A-Z][A-Z]$/){ 
          $i=substr($i,1,1)" "substr($i,2,1)
        }
       }
     }
     1'

给出

1 Affx-14150122 0 75891 00 C T T T C T T T C T1

答案 2 :(得分:0)

这可能适合你(GNU sed):

echo '1 Affx-14150122 0 75891 00 CT TT CT TT CT' | 
sed ':a;s/\(\s\S\)\(\S\(\s\|$\)\)/\1 \2/g;ta'
1 Affx-14150122 0 75891 0 0 C T T T C T T T C T

第二种方法有效,但可能会出现误报:

echo '1 Affx-14150122 0 75891 00 CT TT CT TT CT' | sed 's/\<\(.\)\(.\)\>/\1 \2/g'
1 Affx-14150122 0 75891 0 0 C T T T C T T T C T

答案 3 :(得分:0)

这在python中实际上比在awk中更容易:

echo caca | python -c 'import sys;\
for line in sys.stdin: print (" ".join(line))'

c a c a