Grep表示包含多个元字符的字符串,匹配后提取3行

时间:2016-04-22 19:08:47

标签: linux grep

我想在文件中grep 1:N:0:CGATGT并提取包含1:N:0:CGATGT的行和之后的3行(每行匹配4行)。我已经厌倦了多种方式,所有这些方式都失败了:

[ssabri@login2 data]$ history | tail -n 8
 1028  zcat A1_S1_L008_R1_001.fastq.gz | grep -A4 "1[[:]][[N]][[:]]0[[:]]CGATGT" | wc -l
 1029  zcat A1_S1_L008_R1_001.fastq.gz | grep -A4 "1[[:]][[N]][[:]]0[[:]]CGATGT$" | wc -l
 1030  zcat A1_S1_L008_R1_001.fastq.gz | grep -A4 "1[[:]][[N]][[:]][[0]][[:]]CGATGT$" | wc -l
 1031  zcat A1_S1_L008_R1_001.fastq.gz | grep -A4 -w "1[[:]][[N]][[:]][[0]][[:]]CGATGT$" | wc -l
 1032  zcat A1_S1_L008_R1_001.fastq.gz | egrep -A4 -w "1[[:]][[N]][[:]][[0]][[:]]CGATGT$" | wc -l
 1033  zcat A1_S1_L008_R1_001.fastq.gz | grep -x -A4 -w "1:N:0:CGATGT" | wc -l
 1034  zcat A1_S1_L008_R1_001.fastq.gz | grep -E -A4 -w "1:N:0:CGATGT" | wc -l
 1035  zcat A1_S1_L008_R1_001.fastq.gz | grep -A4 -w "1\:N\:0\:CGATGT$" | wc -l

编辑:输入文件如下所示:

[ssabri@login2 data]$ zcat A1_S1_L008_R1_001.fastq.gz | head -n 12
@J00153:28:H7LNWBBXX:8:1101:28625:1191 1:N:0:CGAGGT
ACNTGCTCCATCCATAGCACCTAGAACAGAGCCTGGNACAGAANAAGNGC
+
A-#<-<<FJJAJFFFF-FJJJJJAJFJJJFF-A-FA#JJJJFJ#JJA#FJ
@J00153:28:H7LNWBBXX:8:1101:29457:1191 1:N:0:CGATGT
GTNGTGGTAGATCTGGACGCGGCTGAAGGCCTGGGGNCCCGTGNCAGN
+
-<#<FJJJJJJJJJJJJJJJJJJJJJJFJJJJJJJJ#JJJJJJ#JJJ#
@J00153:28:H7LNWBBXX:8:1101:31000:1191 1:N:0:CCATGT
TCNAATTATCACCATTACAGGAGGGTCAGTAGAACANGCGTTCTGGTNGG
+
<A#<AFFJJJFJJJFJJJJJJFFFJ7A<<JJFJJJJ#JJJAFJJJJF#-A

3 个答案:

答案 0 :(得分:1)

grep -A3 "1:N:0:CGATGT" file
@J00153:28:H7LNWBBXX:8:1101:29457:1191 1:N:0:CGATGT
GTNGTGGTAGATCTGGACGCGGCTGAAGGCCTGGGGNCCCGTGNCAGN
+
-<#<FJJJJJJJJJJJJJJJJJJJJJJFJJJJJJJJ#JJJJJJ#JJJ#

有时候更简单的思考更好,在这里你不需要任何正则表达式扩展,因为你没有任何需要转义的特殊正则表达式字符串匹配。一个(fter)上下文匹配应该是3,因为你想要3个尾随行(总数将是4,匹配行)。

答案 1 :(得分:0)

我知道你正在寻找一个grep解决方案。但是,这不是文本处理中的唯一选择。如果您使用awk,那么这可能是一个解决方案:

awk ' BEGIN {line=4;} \
    /1:N:0:CGATGT/ {line=0; print $0; next;} \
    { if (line<3) { print $0; line = line+1; } } ' your-file

答案 2 :(得分:0)

考虑到你似乎在使用grep并拔出固定的4行问题,试试这个:

$ awk 'NF>1{f=0} $NF=="1:N:0:CGATGT"{f=1} f' file
@J00153:28:H7LNWBBXX:8:1101:29457:1191 1:N:0:CGATGT
GTNGTGGTAGATCTGGACGCGGCTGAAGGCCTGGGGNCCCGTGNCAGN
+
-<#<FJJJJJJJJJJJJJJJJJJJJJJFJJJJJJJJ#JJJJJJ#JJJ#

不是在匹配后打印固定数量的行,而是从最后一个字段是目标字符串的第一行打印到可能包含目标字符串的下一行之前。

要识别包含目标的4行以外的任何数字块,请使用:

$ awk 'f && NF>1{ if (f!=5) print NR, f-1 | "cat>&2"; f=0} $NF=="1:N:0:CGATGT"{f=1} f{print; ++f}' file

它会输出到stderr输入文件行号和意外块中行数的计数。