删除图案上方的线

Posted

技术标签:

【中文标题】删除图案上方的线【英文标题】:Delete the line above a pattern 【发布时间】:2021-12-15 11:29:10 【问题描述】:

我正在尝试删除文件中包含特定模式的行以及该特定模式正上方的行。模式是“查询”。该文件如下所示:

1. Query= ENST00000641267.1
2. Query= ENST00000641448.1
3. Query= MSTRG.3294.1
4. Query= ENST00000435134.2
5. Query= ENST00000503142.1
6. Query= ENST00000503142.1
7. Query    8  THSLRYFRLGVSDPIHGVPEFISVGYVDSHPITTYDSVTQQKEPRAPWMAENLVPDHWER 187
8. Query  188  YTQLLKGWQQMFRVELKRQQRHYNHSGSHTYQRMIGCELLEDGSTTGFLQYAYDGQNFLI 367
9. Query  368  FNKDTLS*LAVDNVAHTIKRAREANQHELQYQKNWLEEECIA*LKRFLEYGKDTQQ 535
10. Query= ENST00000612670.1
11. Query    1  MVFTQAPAEIMGHLRICSLLARQCLAEFLGVFVLMLLTQGAVAQAVTSGETKGNFFTMFL 180
12. Query  181  AGSLAVTIAIYVGGNVSG 234
13. Query= MSTRG.3309.1

因此应删除第 6 到 12 行,而应保留所有其他行。我尝试了以下方法来删除模式之前的行,但无法使其正常工作:

tac | sed '/Query /'I, +1 d' | tac file.txt > newfile.txt

它只输出 '>' 符号。 有人可以帮忙吗?

期望的输出是:

    1. Query= ENST00000641267.1
    2. Query= ENST00000641448.1
    3. Query= MSTRG.3294.1
    4. Query= ENST00000435134.2
    5. Query= ENST00000503142.1
    13. Query= MSTRG.3309.1

谢谢!

【问题讨论】:

也许您可以使用此答案中的方法来解决与您类似的问题:unix.stackexchange.com/a/29928/438036 是删除第6行到第12行还是第6行和第12行?不清楚。 为什么只删除第 6-12 行?不过,所有的行都有Query这个词。 @cyrus 和 Itération 122442 我改变了问题 这可能对您的示例有所帮助:tac file | sed '/Query /,/Query=/d' | tac 【参考方案1】:

这可能对你有用(GNU sed):

sed '$!N;/\n.*Query /D;/Query /!P;D' file

追加下一行(除非当前行是最后一行)。

如果附加行包含Query ,则删除第一行并重新开始。

如果2行窗口的第一行包含Query ,则不要打印。

否则打印两行中的第一行,删除它并重新开始。

注意下一行的附加取决于它不是最后一行,因为如果调用 N 命令读取文件末尾,sed 的默认行为是打印模式空间。这允许正确处理最后一行,即如果最后一行包含Query ,它将被删除。

【讨论】:

【参考方案2】:
$ tac file | awk '/Query /c=2 !(c&&c--)' | tac
1. Query= ENST00000641267.1
2. Query= ENST00000641448.1
3. Query= MSTRG.3294.1
4. Query= ENST00000435134.2
5. Query= ENST00000503142.1
13. Query= MSTRG.3309.1

请参阅Printing with sed or awk a line following a matching pattern 了解更多信息。

【讨论】:

【参考方案3】:

我会按照下面的方式使用 GNU AWK,让 file.txt 内容成为

1. Query= ENST00000641267.1
2. Query= ENST00000641448.1
3. Query= MSTRG.3294.1
4. Query= ENST00000435134.2
5. Query= ENST00000503142.1
6. Query= ENST00000503142.1
7. Query    8  THSLRYFRLGVSDPIHGVPEFISVGYVDSHPITTYDSVTQQKEPRAPWMAENLVPDHWER 187
8. Query  188  YTQLLKGWQQMFRVELKRQQRHYNHSGSHTYQRMIGCELLEDGSTTGFLQYAYDGQNFLI 367
9. Query  368  FNKDTLS*LAVDNVAHTIKRAREANQHELQYQKNWLEEECIA*LKRFLEYGKDTQQ 535
10. Query= ENST00000612670.1
11. Query    1  MVFTQAPAEIMGHLRICSLLARQCLAEFLGVFVLMLLTQGAVAQAVTSGETKGNFFTMFL 180
12. Query  181  AGSLAVTIAIYVGGNVSG 234
13. Query= MSTRG.3309.1

然后

awk 'NR>1&&!/Query /&&prev!~/Query /print prevprev=$0ENDif(prev!~/Query /)print prev' file.txt

输出

1. Query= ENST00000641267.1
2. Query= ENST00000641448.1
3. Query= MSTRG.3294.1
4. Query= ENST00000435134.2
5. Query= ENST00000503142.1
13. Query= MSTRG.3309.1

解释:我使用prev 变量来存储上一行,如果当前行不匹配Query 并且上一行不匹配Query 然后我打印上一行。正如我print 上一行,我需要单独考虑最后一行,为此我使用END

(在 GNU Awk 5.0.1 中测试)

【讨论】:

以上是关于删除图案上方的线的主要内容,如果未能解决你的问题,请参考以下文章

PPT技巧讲解:怎么将文字笔画变成图案

模式重复时如何删除两个模式之间的线(删除包括模式)

ArcEngine的线要素删除一些节点后如何更新

GraphicsPath 和 DrawPath - 删除相交的线

如何在文本文件中检测到大于n的“凹陷”(孔,不匹配图案的线)序列?

Matlab:删除第一个和最后一个点之间的线