【问题标题】:Problems with awk substrawk substr 的问题
【发布时间】: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 行。

标签: awk split substr


【解决方案1】:

我猜你看起来像这样,但你的问题格式真的很混乱

$ awk -v OFS='\t' 'NR==1   {next} 
                   NR==2   {n=index($0,"GATC")} 
                   /^[^+]/ {print substr($0,1,n-1),substr($0,n)}' file

ACCTAGAAGGATATGCGCTTGCGCGTTAGA  GATCACTAGAGCTAAGGAATTTGAGATTACAGTAAGCTATGATCC
/AAAAEEEEEEEEEEAAEEEAEEEEEEEEE  EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

我假设你的文件是这种格式

dummy header line to be ignored
ACCTAGAAGGATATGCGCTTGCGCGTTAGAGATCACTAGAGCTAAGGAATTTGAGATTACAGTAAGCTATGATCC
+
/AAAAEEEEEEEEEEAAEEEAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

【讨论】:

  • 是的,格式如你所说。关键是有时候第一行有两个GATC,所以可以分成三段。
猜你喜欢
  • 1970-01-01
  • 2015-02-16
  • 2014-09-03
  • 2015-10-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
相关资源
最近更新 更多