如何从 gz 文件中提取特定文本?

How to extract a specific text from gz file?

我需要从我的 fastq.gz 数据中提取 5 到 11 个字符,这个数据对于 R 中的 运行 来说太大了。所以我想知道我是否可以直接在 Linux命令行? fastq 文件如下所示:

@NB501399:67:HFKTCBGX5:1:11101:13202:1044 1:N:0:CTTGTA
GAGGTNACGGAGTGGGTGTGTGCAGGGCCTGGTGGGAATGGGGAGACCCGTGGACAGAGCTTGTTAGAGTGTCCTAGAGCCAGGGGGAACTCCAGGCAGGGCAAATTGGGCCCTGGATGTTGAGAAGCTGGGTAACAAGTACTGAGAGAAC
+
    AAAAA#EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEAAAEEEEEEEEEEEEEEEEAEEEEEEEEEEEEEEAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEAE6

@NB501399:67:HFKTCBGX5:1:11101:1109:1044 1:N:0:CTTGTA
TAGGCNACCTGGTGGTCCCCCGCTCCCGGGAGGTCACCATATTGATGCCGAACTTAGTGCGGACACCCGATCGGCATAGCGCACTACAGCCCAGAACTCCTGGACTCAAGCGATCCTCCAGCCTCAGCCTCCCGAGTAGCTGGGACTACAG
+

而我只想把位于序列部分的第5到11个字符(第一个是TNACGG,第二个是CNACCT)提取出来做成一个新的txt文件。我可以这样做吗?

您可以将 GNU sed 与 zcat 一起使用:

zcat fastq.gz | sed -n '2~5{s/.\{4\}\(.\{6\}\).*//;p}'
  • -n表示默认不打印行
  • 2~5表示从第2行开始,每5行匹配一次
  • 当"address"匹配时,替换记住</code>中的第五到第十个字符并用它替换整行,<code>p打印结果

另一个使用 zgrep 和正面回顾:

$ zgrep -oP "(?<=^[ACTGN]{4})[ACTGN]{6}" foo.gz
TNACGG
CNACCT

解释:

  • zgrep : man zgrep: 在可能的压缩文件中搜索正则表达式
  • -o 仅打印匹配行的匹配(非空)部分
  • -P 将模式解释为 Perl 兼容的正则表达式 (PCRE)。
  • (?<=^[ACTGN]{4}) 正面回顾
  • [ACTGN]{6} 匹配前面有 6 个命名字符
  • foo.gz我的测试文件
$ zcat fastq.gz | awk '(NR%5)==2{print substr([=10=],5,6)}'
TNACGG
CNACCT