如何使用grep / awk / bash / etc删除文件中最后一次出现的模式?

时间:2017-01-25 03:46:50

标签: bash awk grep

使用grep / awk / bash / etc删除文件中最后一次出现的模式的最简单方法是什么?例如,我有一个文件,其中表达式“hello world”出现多次,我想删除整行或者只是最后一次出现“hello world”。谢谢!

3 个答案:

答案 0 :(得分:1)

如果您碰巧拥有GNU coreutils(或者您愿意安装它们),您可以使用偶尔有用的tac命令来翻转文件进行处理,从而可以将此问题视为“删除< em>第一次出现模式“,这有点简单:

tac /path/to/file | awk '!found && /Hello, world/{found=1;next}1' | tac

否则,你需要做一些事情,比如在内存中缓冲文件的所有行,以便你可以在最后打印出来。或者您可以处理该文件两次,第一次只是查找要省略的行号,但这要求数据在文件中,而不是您输入命令的流:

awk \
  -v line="$(grep -hn "hello world" /path/to/file | tail -n1 | cut -f1 -d:)" \
  "{NR != line}" /path/to/file

答案 1 :(得分:1)

你可以这样做:

awk '/^hello world/ {max=NR} 
     {a[NR]=$0} 
     END{for (i=1;i<=NR;i++) {if (i!=max) print a[i]}}' file

或者,如果文件大小是一个问题,请遍历它两次并使用grep来计算匹配。使用awk跳过最后一场比赛:

awk -v last=$(grep -c '^hello world' file) '/^hello world/ && ++cnt==last{ next } 1 ' file

答案 2 :(得分:1)

您可以两次读取文件,并且可以在不使用import { Component, OnInit } from '@angular/core'; import { AngularFire } from 'angularfire2'; import { FormBuilder } from '@angular/forms'; import { Router } from '@angular/router'; @Component({ selector: 'app-signup', templateUrl: './signup.component.html', styleUrls: ['./signup.component.scss'] }) export class SignupComponent { public signupForm = this.fb.group({ email: [""], password: [""] }); constructor(private router: Router, public fb: FormBuilder, public af: AngularFire) {} signup() { console.log(this.signupForm.value); this.af.auth.createUser(this.signupForm.value).catch(function(error) { alert(error.message); }); this.router.navigate(['store']) } }

之类的数组的情况下实现此目的

<强>输入

tac

<强>输出

[akshay@gold tmp]$ cat f
1   hai
2   hello
3   this
4   is
5   test
6   hello
7   this
8   is
9   test

<强>解释

[akshay@gold tmp]$ awk 'last==FNR{next}FNR!=NR{print;next}/hello/{last=FNR}' f f 1 hai 2 hello 3 this 4 is 5 test 7 this 8 is 9 test - 它提供了处理的记录总数。

NR - 它给出了每个输入文件的总记录数。

FNR