2

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

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

4 回答 4

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 个字符的序列时,这会失败。

于 2012-08-16T10:14:32.437 回答
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
于 2012-08-16T10:41:03.257 回答
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
于 2012-08-16T11:41:54.943 回答
0

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

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

卡卡

于 2016-02-17T05:02:37.480 回答