2012-08-16 74 views
2

另一个sed问题!我在对在字符对之间插入空格 - 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取代与..,它永远不会分裂,因为我愿意它(它把空间之前或之后或分裂每隔一对或类似的!)。

回答

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

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

如果让从5循环运行或6〜'NF'(取决于有机磷农药需要),你可以避免使用'if'。 – Thor 2012-08-16 11:20:26

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 
0

这是蟒蛇比AWK其实更容易:

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

CACA