2013-08-16 76 views
0

我的問題是:分裂根據charatcer數據字段分爲兩個算

我有數據,看起來像這樣:

>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

回答

3

一個sed的一行能做到這一點

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

這完全做的工作。謝謝。 – user1308144

+0

@ user1308144你確定嗎?您的輸入是否可以包含超過4位數字的數字,頭部數量是否可以超過100? –

+0

@sudo_O在這種情況下,它永遠不會超過4位數。在這種情況下,頭文件也不會引起問題(在示例中遵循第一個頭文件的樣式),但是感謝您指出它,因爲在順序編號的頭文件中會導致問題。 – user1308144

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

這可能爲你工作(GNU SED):

sed '/^>/!s/\S\S\B/& /g' file 

對於不具有>開始後一個字內的2個非空間添加一個空格行。

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