计算不包含特定单词的特定行

时间:2020-04-23 19:58:28

标签: grep bioinformatics biopython

请问我一个问题:我有一个这样的文件

@HWI-ST273:296:C0EFRACXX:2:2101:17125:145325/1
TTAATACACCCAACCAGAAGTTAGCTCCTTCACTTTCAGCTAAATAAAAG
+
8?8A;DDDD;@?++8A?;C;F92+2A@19:1*1?DDDECDE?B4:BDEEI
@BBBB-ST273:296:C0EFRACXX:2:1303:5281:183410/1
TAGCTCCTTCGCTTTCAGCTAAATAAAAGCCCAGTACTTCTTTTTTACCA
+
CCBFFFFFFHHHHJJJJJJJJJIIJJJJJJJJJJJJJJJJJJJIJJJJJI
@HWI-ST273:296:C0EFRACXX:2:1103:16617:140195/1
AAGTTAGCTCCTTCGCTTTCAGCTAAATAAAAGCCCAGTACTTCTTTTTT
+
@C@FF?EDGFDHH@HGHIIGEGIIIIIEDIIGIIIGHHHIIIIIIIIIII
@HWI-ST273:296:C0EFRACXX:2:1207:14316:145263/1
AATACACCCAACCAGAAGTTAGCTCCTTCGCTTTCAGCTAAATAAAAGCC
+
CCCFFFFFHHHHHJJJJJJJIJJJJJJJJJJJJJJJJJJJJJJJJJJJIJ

我对以'@HWI'开头的行很感兴趣,但是我想计算所有不以'@HWI'开头的行。在所示示例中,结果为1,因为只有一行以'@BBB'开头。

更清楚地说:我只想知道不是'@HWI'的模式的第一行的数目(重复的4行);我希望我足够清楚。请告诉我是否需要进一步澄清

1 个答案:

答案 0 :(得分:0)

使用GNU sed,您可以使用其扩展地址打印每四行,然后使用grep计数不以@HWI开头的行:

sed -n '1~4p' file.fastq | grep -cv '^@HWI'

否则,您可以使用Perl

perl -ne 'print if 1 == $. % 4' -- file.fastq | grep -cv '^@HWI'

$.包含当前行号,%是模运算符。

但是一旦我们运行了Perl,我们就不再需要grep了:

perl -lne '++$c if 1 == $. % 4; END { print $c }' -- file.fastq

-l从输入中删除换行符,并将其添加到输出中。