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

时间:2018-12-14 13:02:13

标签: linux awk sed grep fastq

我需要从我的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文件。我可以这样做吗?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

另一个使用zgrep并向后看的人:

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

解释:

  • zgrepman zgrep搜索可能的压缩文件以查找正则表达式
  • -o 仅打印匹配行的匹配(非空)部分
  • -P 将模式解释为与Perl兼容的正则表达式(PCRE)。
  • (?<=^[ACTGN]{4})令人反感
  • [ACTGN]{6}匹配上面的6个命名字符
  • foo.gz我的测试文件

答案 2 :(得分:3)

$ zcat fastq.gz | awk '(NR%5)==2{print substr($0,5,6)}'
TNACGG
CNACCT