awk 字符串中带有斜杠的子字符串

awk substring with slash in string

我有一个包含生物序列的 fastq 文件。例如,一个名为 test.fq 的文件包含以下四行:

@ABC012:106:087H3Y27J:1:11112:11679:1250 2:N:0:CGTAGCTC+ACGCTATA
CAGCATAGCTCTTAAACTGACATCAATTGATCATATCCGG
+
6FF/AFF/FAFF/FFF6FFFFF/AFFFAAFFAFFFF//FA

我想从每个偶数行的第 18 个位置开始提取 20 个字符(包括计数中的斜杠)。

我试过了

awk 'FNR%2==0{s=[=11=]; print substr($s,18,20); next} 1' test.fq

当字符串中没有斜杠时它工作正常,有时当有斜杠时也能正常工作,但不适用于上述字符串。谁能建议如何解决这个问题?另外,为什么上面的 awk 语句对某些带有斜杠的字符串有效,例如 FFAFFFFFF/FFFFFFFFFFFFFFFFFAFFFFFFFFFFFF 但对其他字符串无效?

您正在使用 $s,它使用 $ 指向字段编号,但它应该只是 s

awk 'FNR%2==0{s=[=10=]; print substr(s,18,20); next} 1' test.fq

如果该行也应以数字开头:

awk 'FNR%2==0 && /^[0-9]/{print substr(,18,20); next}1' test.fq

请注意,如果检查未通过,由于 }1

,您仍将打印整行

不是检查 modulo %0,而是使用 next} 1 的尾印,而是翻转它们的顺序:

{m,n,g}awk 'NR % 2 || $-_=substr($-_,18,20)'    

|

@ABC012:106:087H3Y27J:1:11112:11679:1250 2:N:0:CGTAGCTC+ACGCTATA
TGACATCAATTGATCATATC
+
FFFFF/AFFFAAFFAFFFF/
  • NR % 2 执行 } 1' 对奇数行执行的操作

  • back-assigning substr() 变成 [=20=] 没有动作块是一样的 作为 print + next,只是稍微不那么冗长。

如果您非常担心斜杠被误解为 regex,那么就把它改成

mawk 'NR % 2 || ($_=substr($_,18,20))^_'

这样,输入字符串的任何内容都不会被解释,因为 0-th power, i.e. 1,在它的尾部是被评估的布尔表达式,而不是 regex