2012-08-16 90 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