BASH - 在字符(下划线)的特殊出现处拆分字符串,具体取决于字符串中下划线的总数

BASH - Splitting string at special occurence of character (underscore), depending on total number of underscores in string

我有一个包含多列和多行的数据框,其中一列包含不同的字符串,每个字符串由不同数量的下划线组成。我想将每个字符串分成两半,这取决于出现的次数。

示例:

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

希望有人能帮助我。提前致谢!

您可以使用这个 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/(^| )([^ ]*)_//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      ...
...        ...        ...          ...

$ sed -r 's/(^| )( *)([^ ]*)_//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    ...
            ...                     ...             ...    ...

逻辑:
将 (string)_(repeat of same string) 替换为 (string)
sed(以及大多数其他基于正则表达式的工具)中,</code>/<code>/ 等引用先前匹配项的反向引用。