我有这个数据选项卡分隔:
ed00011 89 0.12 NA NA No
ed0002s 28 0.11 c3(3.1e-1) NA No
ed0001 22 0.37 NA 186_CR_NCR8_Ot(1.5e-6) No
ed0002a 596 0.89 c301(9.5e-2) 17_CY7_Ot(0.03) Yes
我想根据“(...)”拆分第 4 列和第 5 列。如果不存在,则只有 NA。例如:
ed00011 89 0.12 NA NA NA NA No
ed0002s 28 0.11 c3 3.1e-1 NA NA No
ed0001 22 0.37 NA NA 186_CR_NCR8_Ot 1.5e-6 No
ed0002a 596 0.89 c301 9.5e-2 17_CY7_Ot 0.03 Yes
我尝试使用此处建议的命令:splitting a column using awk 但是,当我没有“(...)”时,我的列将被弄乱。有什么建议么?
这里的基本结构是在每一行检查字段 4 或字段 5 是否包含一对匹配的括号。如果是这样,则将该字段替换为两个制表符分隔值:括号前的部分和括号内的部分。RSTART 值是左括号所在的位置,而 RLENGTH 值包括右括号,所以这就是您看到一些长度调整的原因。如果这些字段不包含括号,则会附加 TAB 和“NA”。
重新计算列后,将打印新行。
测试:
这些字段在输出中以制表符分隔,但看起来有点不稳定。通过时更好
column -t
,但实际的选项卡丢失了:可靠的方法
不可靠,但正在处理您的样品、方法
此命令执行三个简单的步骤:
s/NA/&\tNA/g
- 将所有替换为由制表符分隔的NA
双倍。NA
s/(/\t/g
- 将所有左括号替换为制表符。s/)//g
- 删除所有右括号。它是不可靠的,因为它做了很多假设:括号只能出现在第 4 和 5 列,
NA
字符串只能出现在第 4 和 5 列,第 4 和 5 列的数字字符串总是具有c3(3.1e-1)
相同的格式。所以,如果他们c3
只有一个没有括号的部分,这个sed
命令就不会起作用。但是,如果您的数据与您的样本严格相同,则可以完成这项工作。
输出