我有一个数据框架,它有几个列和行,其中一列包含不同的字符串,每个字符串由不同数量的下划线组成。我想把每个字符串一分为二,这取决于出现的次数。
示例:
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
等引用了以前匹配的后引用。