Grep只匹配特定的行,但保持上下文

我有一个文件,我只在偶数行上寻找模式“N”。 当一行匹配时,我想保留上下文 - 它上面的奇数行。

我知道如何使用-A,-B,-C来保持上下文,但模式“N”也可能与奇数行匹配,所以我认为解决问题的唯一方法是将奇数行使用grep之前的行,从而删除上下文。

有没有办法做到这一点,而不必提取与grep匹配的行号,然后从文件中事后得到这些特定的行? 我怀疑我可以用awk来完成,但我不确定。

我试图优化我认为已经有效的代码,因为它将运行的文件将会很庞大,需要数小时才能运行。


我试图找到其中有“N”个的任何DNA序列,并将它们放在一个文件中,以及任何其中没有“N”的序列,并将它们放入另一个文件中。 然而,ID线也可以具有“N”个。 我希望ID行在新文件中保持连接到它上面一行中的每个序列。

示例输入:

>100000|NODE_2_length_277_cov_4.245487
ATCTTTTAACCCCAAAAACTCAAGTATGTGAGCCAAGTGAACATAACTGCATAAATATCAGGCTCCAAAATAATCTACTGCTTGTTGTGTAGATATAGAGCACACAATTTCTTTTTTAAAGCCCTCCCTTTCACTCTCTCTATCCCACACCCAGAAAAACTCCTATTTAGAGAAAGCCACACCTATCACTAAGAGCAAACCAACCTTTCAAAAAAAAAAAAAAAACACATTAGGAGCAAACTGTTAGGAGCCATTCAAAACCAAAGGAAATGCCAAGACACACACACACACACACACACACAC
>100001|NODE_1_length_426_cov_11.427230
AAATATATAAAAAACCTGTGTTGTGACAACAGGTTGAGAAGTAATGAGAAAATGGACGAATTAGTTCAGGATGTCTCAAAGCAGATTTCTTTCCACTTAATCTCGATGTCCTACGAAAATGCTGACTTAGGTTGTAGTTTATGTTTCTTAGATTCCAATATTTTAAAATGGCCCTTGAAATTATATTAAAAAGCTCATGAACAAGTGCATAATCAATGATAAATGAATATTTATGGTTGAGATTTGGGAATTATTAATCAATATACCTCTATACTCTTGGCTCTCTTGAAGTTTAATTCAAGTGTATTTAATTAGATTCCTACCCCAAATCAACTTTAAGAAGGCTGCTTTTCTTCTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCG

另一种解决方案是击键次数较少

awk '!(NR%2) && /N/ {print p; print}{p=$0}'

!(NR%2)习语用于选择偶数行; 由于只打印匹配的行,所以也保持前一行没有任何条件。


用awk:

seq 10 | 
awk -v pattern='[26]' '
  FNR % 2 == 1 {odd = $0}
  FNR % 2 == 0 && $0 ~ pattern {print odd; print}
'
1
2
5
6

使用您的示例输入:

awk  '
  FNR % 2 == 1 {odd = $0}
  FNR % 2 == 0 {
    if (/N/) 
      file = FILENAME ".with_N"
    else 
      file = FILENAME ".no_N"
    print odd > file
    print     > file
  }
' myfile
链接地址: http://www.djcxy.com/p/19645.html

上一篇: Grep match only specific lines, but keep context

下一篇: How do I make python go back in code?