如何在模式最后一次出现后删除所有行?

j.d*_*doe 2 bash awk sed

我希望删除模式最后一次出现后的所有行,除了模式本身

file.txt的

honor
apple
redmi
nokia
apple
samsung
lg
htc
Run Code Online (Sandbox Code Playgroud)

file.txt我想要的

honor
apple
redmi
nokia
apple
Run Code Online (Sandbox Code Playgroud)

我试过的

sed -i '/apple/q' file.txt
Run Code Online (Sandbox Code Playgroud)

这会在第一次出现模式后删除所有行 -

honor
Run Code Online (Sandbox Code Playgroud)

Ed *_*ton 6

使用几乎没有内存的简单,强大的2遍方法:

$ awk 'NR==FNR{if (/apple/) hit=NR; next} {print} FNR==hit{exit}' file file
honor
apple
redmi
nokia
apple
Run Code Online (Sandbox Code Playgroud)

如果这个执行速度不够快,那么就该尝试一些替代方案,看看是否会产生性能提升.


Bar*_*mar 5

反转文件,从第一次出现的模式开始打印所有内容,然后反转结果:

tac file.txt | sed -n '/apple/,$p' | tac > newfile.txt
Run Code Online (Sandbox Code Playgroud)

您可以找到最后一个匹配的行号,然后用它来打印文件的前 N ​​行:

line=$(awk '/apple/ { line=NR } END {print line}')
head -n $line file.txt > newfile.txt
Run Code Online (Sandbox Code Playgroud)