awk - 如果满足条件,打印前后的特定行

awk - if condition is met, print specific lines before and after

具有以下blastout.txt

blastout.txt

我需要搜索所有包含 Identities = [>=50]

的行
  1. 打印上面包含 Query=
  2. 的一行
  3. 打印下面第5行

示例输出(此处仅显示第一行):

Query= HWI-ST863:386:C5Y8UACXX:3:1307:8061:42115 1:N:0:ACACGAAT
Sbjct  2030309  ATGACGCTCACCTTGGTGTCGATATCCTCACCTGCGGTGCCAATGCCGCTGCCCGCGGTC  2030250
Query= HWI-ST863:386:C5Y8UACXX:3:2209:19756:21341 1:N:0:ACACGAAT
Sbjct  2418742  CAGGCGTTCCGGCAGTTTGTGCTGGAAGAGGCCCGTGGCCTGGCGGAGCCTCTGCCGGCG  2418683
Query= HWI-ST863:386:C5Y8UACXX:3:1302:8580:7972 1:N:0:ACACGAAT
Sbjct  3178017  CCAGTTATGCTTGGGGCAGGTGAGCTTGTTGCCTTCCAGGGCGAGCTCGGGGATATCCGT  3178076

我解决了2.:

awk 'c&&!--c;/Identities =/ && (+0)>=50 {c=5}' blastout.txt

这对我来说是可行的,因为文件的结构总是相同的。但是对于1.,行数是变化的,而且对于Query=的一个条目,也可能有不止一行匹配模式。

非常感谢您在实施过程中提供的帮助!

/Query/{q=[=10=]} c...; /Identities/...{print q; c=5}

如果这不是您所需要的全部,那么编辑您的问题以包含简明、可测试的样本输入和预期输出。不要 ask/expect 我们去其他网站寻找示例,因为这意味着您懒得想出一个简明的问题示例,并希望我们为您做努力理解的工作一些大数据集。

拼写:

awk '/Query/{q=[=11=]} c&&!--c; /Identities =/ && (+0)>=50 {print q; c=5}' blastout.txt

好吧,我不能告诉你如何用 awk 来做,但我可以用 sed 来做。

blastout.sed 脚本是:

# place 'Query=' line in hold space
/^Query=/h
# If we find an Identity line
/^ Identities = \([5-9][0-9]\|[1-9][0-9][0-9]\)/{
# Exchange pattern with hold space (the Query= line) and print
x
p
# Exchange pattern with hold space (the Identities = line) and print
x
p
# Get the fifth line and print
n
n
n
n
n
p
}

运行 它与命令 sed -n -f blastout.sed blastout.txt.

以下是一些结果:

$ sed -n -f blastout.sed blastout.txt | head -12
Query= HWI-ST863:386:C5Y8UACXX:3:1307:8061:42115 1:N:0:ACACGAAT
 Identities = 100/100 (100%), Gaps = 0/100 (0%)
Sbjct  2030309  ATGACGCTCACCTTGGTGTCGATATCCTCACCTGCGGTGCCAATGCCGCTGCCCGCGGTC  2030250
Query= HWI-ST863:386:C5Y8UACXX:3:2209:19756:21341 1:N:0:ACACGAAT
 Identities = 99/100 (99%), Gaps = 0/100 (0%)
Sbjct  2418742  CAGGCGTTCCGGCAGTTTGTGCTGGAAGAGGCCCGTGGCCTGGCGGAGCCTCTGCCGGCG  2418683
Query= HWI-ST863:386:C5Y8UACXX:3:1302:8580:7972 1:N:0:ACACGAAT
 Identities = 100/100 (100%), Gaps = 0/100 (0%)
Sbjct  3178017  CCAGTTATGCTTGGGGCAGGTGAGCTTGTTGCCTTCCAGGGCGAGCTCGGGGATATCCGT  3178076
Query= HWI-ST863:386:C5Y8UACXX:3:1106:4759:9532 1:N:0:ACACGAAT
 Identities = 100/100 (100%), Gaps = 0/100 (0%)
Sbjct  32627  CGAGGCCGCGGTTTTGGACCTGGACGAGGGGAGTCGGCGTGTGAGTCTTGCGACCCTGGA  32686

(更正为打印第 第五 行。)