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

时间:2015-07-14 18:49:55

标签: bash awk grep

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

我理解如何保持上下文using -A, -B, -C,但模式" N"也可能匹配奇数行,所以我能想到解决问题的唯一方法是在使用grep之前分离偶数行和奇数行,从而删除上下文。

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

我正在尝试优化我认为已经有效的代码,因为它将处理的文件非常庞大,需要数小时才能运行。

我试图找到其中包含" N"的任何DNA序列,并将它们放在一个文件中,以及任何不具有&#34的序列; N"在其中,并将它们放在另一个文件中。然而,ID行也可以具有" N" s。我希望ID行保持连接到新文件中它上面一行中的每个序列。

示例输入:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

!(NR%2)成语用于挑选偶数行; 也保持前一行没有任何条件,因为只打印匹配的行。