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>
/
等引用先前匹配项的反向引用。
我有一个包含多列和多行的数据框,其中一列包含不同的字符串,每个字符串由不同数量的下划线组成。我想将每个字符串分成两半,这取决于出现的次数。
示例:
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>
/ 等引用先前匹配项的反向引用。