我有个问题。我有一个文件是这样的
@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
I
我只对以'@HWI'开头的行感兴趣,但我想计算所有不是以'@HWI'开头的行。在所示的例子中,结果将是1,因为有一行是以'@BBB'开头的。
更清楚的说:我只是想知道模式的第一行(有4行重复)不是以'@HWI'开头的行数;我希望我说的足够清楚。如果你需要更多的说明,请告诉我。
使用 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'
$.
包含当前行号。%
是modulo运算符。
但是一旦我们运行了 Perl,我们就不再需要 grep 了。
perl -lne '++$c if 1 == $. % 4; END { print $c }' -- file.fastq
-l
就可以从输入中删除换行符,并将其添加到输出中。