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