2016-07-19 27 views
0

1つの列に異なる文字列が含まれている複数の列と行のデータフレームがあります。下線。したがって、出現回数に応じて、各文字列を半分に分割したいと思います。BASH - 文字列のアンダースコアの合計数に応じて、特殊文字(アンダースコア)での文字列の分割

例:

   ID_1     ID_2  haplotypeID ... 
      A_B_A_B     A_B_A_B   hap.1.1 ... 
     A_B_C_A_B_C    A_B_C_A_B_C   hap.1.2 ... 
    A_B_C_D_A_B_C_D   A_B_C_D_A_B_C_D   hap.2.1 ... 
A_B_C_D_E_A_B_C_D_E  A_B_C_D_E_A_B_C_D_E   hap.2.1 ... 
       ...      ...    ... ... 

出力は次のようになります。

  ID_1    ID_2  haplotypeID ... 
      A_B    A_B   hap.1.1 ... 
      A_B_C   A_B_C   hap.1.2 ... 
     A_B_C_D   A_B_C_D   hap.2.1 ... 
     A_B_C_D_E  A_B_C_D_E   hap.2.1 ... 
      ...    ...    ... ... 

私は、誰かが私を助けることができると思います。前もって感謝します!

+0

だから、いつも 'somestring_thatsamestring'という形式になっていますか?入力に ​​'A_B_C_D'または' A_B_A_B'だけのインスタンスがありますか? – anishsane

+0

入力は常に対称的です。つまり、1つの文字列では、インスタンスが2回、アンダースコアで区切られ、something_thatsamestringの形式で表示されます。 A_B_A_Bは表示されますが、A_B_C_Dは表示されません。 – Svalf

+0

'sed -r 's /(^ |)([^] *)_ \ 2/\ 1 \ 2/g'を試してくださいinput.txt |列-t' – anishsane

答えて

1

あなたはこのために、このsedを使用することができます。

$ cat input.txt 
       ID_1     ID_2  haplotypeID ... 
      A_B_A_B     A_B_A_B   hap.1.1 ... 
     A_B_D_A_B_D    A_B_C_A_B_C   hap.1.2 ... 
    A_B_C_D_A_B_C_D   A_B_C_D_A_B_C_D   hap.2.1 ... 
A_B_C_D_E_A_B_C_D_E  A_B_C_D_E_A_B_C_D_E   hap.2.1 ... 
       ...      ...    ... ... 

$ sed -r 's/(^|)([^ ]*)_\2/\1\2/g' input.txt | column -t 
ID_1  ID_2  haplotypeID ... 
A_B  A_B  hap.1.1  ... 
A_B_D  A_B_C  hap.1.2  ... 
A_B_C_D A_B_C_D hap.2.1  ... 
A_B_C_D_E A_B_C_D_E hap.2.1  ... 
...  ...  ...   ... 

OR

$ sed -r 's/(^|)(*)\2([^ ]*)_\3/\1\2\3/g' inp 
       ID_1     ID_2  haplotypeID ... 
     A_B   A_B   hap.1.1 ... 
    A_B_D  A_B_C   hap.1.2 ... 
    A_B_C_D  A_B_C_D   hap.2.1 ... 
A_B_C_D_E A_B_C_D_E   hap.2.1 ... 
      ...      ...    ... ... 

をロジック:
は(文字列)による(文字列)_(同じ文字列の繰り返し)sed
を交換してください(&他のほとんどの正規表現ベースのツール)、\1/\2/\3などを参照してください。以前の試合の後方参照。

+0

あなたの素早い答えをありがとう、これは完全に働いた! – Svalf

関連する問題