【发布时间】:2019-12-14 06:46:43
【问题描述】:
我正在尝试使用 substr awk 命令拆分文件列。所以输入如下(4行,1个空行):
@NS500645:122:HYGVMBGX2:4:21402:2606:16446:ACCTAGAAGG:R1
ACCTAGAAGGATATGCGCTTGCGCGTTAGAGATCACTAGAGCTAAGGAATTTGAGATTACAGTAAGCTATGATCC
/AAAAEEEEEEEEEEAAEEEAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
我想用“GATC”模式分割第二行,但将其保留在正确的子字符串中,例如:
ACCTAGAAGGATATGCGCTTGCGCGTTAGA GATCACTAGAGCTAAGGAATTTGAGATTACAGTAAGCTATGATCC
我希望最后一行与拆分后的长度相同,并重新生成文件,如下所示:
ACCTAGAAGGATATGCGCTTGCGCGTTAGA
/AAAAEEEEEEEEEEAAEEEAEEEEEEEEE
GATCACTAGAGCTAAGGAATTTGAGATTACAGTAAGCTAT
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
GATCC
EEEEE
为了拆分最后一列,我使用了这个 awk 脚本:
cat prove | paste - - - - | awk 'BEGIN
{FS="\t"; OFS="\t"}\ {gsub("GATC","/tGATC", $2); {split ($2, a, "\t")};\ for
(i in a) print substr($4, length(a[i-1])+1,
length(a[i-1])+length(a[i]))}'
但是输出如下:
/AAAAEEEEEEEEEEAAEEEAEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
第二行和第三行比预期的要长。
我检查了传递给 substr 命令的计算长度并且是正确的:
1 30
31 70
41 45
使用这些长度,输出应该是:
/AAAAEEEEEEEEEEAAEEEAEEEEEEEEE
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
EEEEE
但正如我所展示的,事实并非如此。
有什么建议吗?
【问题讨论】:
-
您说的是
I want to split the first line by the pattern "GATC",但第一行@NS500645:122:HYGVMBGX2:4:21402:2606:16446:ACCTAGAAGG:R1不包含“GATC”。您的意思是要拆分第二行ACCTAGAAGGATATGCGCTTGCGCGTTAGAGATCACTAGAGCTAAGGAATTTGAGATTACAGTAAGC?您还说您的输入是 4 行,但随后显示 5 行,并且知道the + in a separate line的含义。请清理您的问题。 -
是的,我要拆分第 2 行,输入包含 4 行。