2016-07-19 1 views
0

Ich habe einen Datenrahmen mit mehreren Spalten und Zeilen, wobei eine Spalte verschiedene Zeichenketten enthält, wobei jede Zeichenkette aus einer anderen Anzahl besteht unterstreicht. Ich möchte jeden String in zwei Hälften teilen, abhängig von der Anzahl der Vorkommen.BASH - Teilungszeichenfolge bei besonderem Vorkommen von Zeichen (Unterstrich), abhängig von der Gesamtzahl der Unterstriche in der Zeichenkette

Beispiel:

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

Der Ausgang wäre:

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

Ich hoffe jemand kann mir helfen. Vielen Dank im Voraus!

+0

Also, wird es immer von der Form 'somestring_thatamestring' sein? Wird es in der Eingabe Instanzen von "A_B_C_D" oder nur "A_B_A_B" geben? – anishsane

+0

Die Eingabe wird immer symmetrisch sein, was bedeutet, dass in einer Zeichenfolge die Instanz zweimal auftritt, getrennt durch einen Unterstrich in der Form Something_thatamestring. A_B_A_B erscheint, aber nicht A_B_C_D. – Svalf

+0

Versuchen Sie 'sed -r 's/(^ |) ([^] *) _ \ 2/\ 1 \ 2/g' input.txt | Spalte -t' – anishsane

Antwort

1

Sie können diese sed für diesen Einsatz:

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

ODER

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

Logic:
ersetzen (string) _ (Wiederholung der gleichen string) durch (string)
In sed (& die meisten anderen Regex-basierten Tools), \1/\2/\3 usw. beziehen sich auf die Rückreferenzen der vorherigen Spiele.

+0

Vielen Dank für Ihre schnelle Antwort, das hat perfekt funktioniert! – Svalf

Verwandte Themen