删除具有相似关键字的行(如果它们出现在连续行中)

时间:2017-10-14 12:04:32

标签: linux unix

我有一个以下格式的文本文件

sam has got grade B
score for him is 70
bob has got grade A
score for him is 90 
score for him is 60
ronny has got grade B
score for him is 75
tony has got grade A
score for him is 91

我们看到第4行和第5行都有得分,第5行之前缺少等级线。

我能想到的一种方式

grep'等级' file.txt -A 1

但是,这只会过滤缺少成绩的行。可能会有很少的线路,其中有分数但缺少分数。

在unix / linux中是否还有其他更好的命令,我们可以删除这些连续的行,这两行包含两行包含成绩或分数。

2 个答案:

答案 0 :(得分:1)

这是我的awk解决方案,

awk '{ if (prev != $2 $3 $4) {print $0} ; prev = $2 $3 $4 ; }' file.txt

请注意,此解决方案存在一个小错误,即如果末尾有多条相似的行,则会在末尾输出一条额外的行,可以轻松删除。

默认情况下,awk使用空格来分隔每行中的单词,并按顺序为每个单词命名为$ 1,$ 2,$ 3等。 prev = $2 $3 $4;会将第二个+第三个+第四个单词保存在变量prev中。如果您的案例中有连续的行,则$ 2,$ 3,$ 4将与上一行中的相同。如果它们不相同,print $0将打印整行。

答案 1 :(得分:0)

不是Bash命令行,但是如果你想要删除两个同时具有'grade'或'score'的行,你可以打开vim并运行

:%s/^score.*\zs\nscore.*$//

在以“得分”和

开头的行之后删除以“得分”开头的行
:%s/grade.*\zs\n.*grade.*$//

要删除其中包含“成绩”的行,并在其中添加“成绩”。