如何从 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
我需要从我的 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