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

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

您可以将此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/12/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/(^| )( *)2([^ ]*)_3/123/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等引用了以前匹配的后引用。

最新更新