2017-10-14 65 views
0

我有以下格式删除与类似关键字行,如果它们出现在连续的行

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中有没有其他更好的命令,我们可以删除这样的连续行,它们有两行包含等级或分数。

回答

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将打印整行。

+0

非常感谢,它工作得很好。你能否提供解释如何工作 – Zoro99

+0

当然。我会将其添加到我的答案中。 –

0

不bash命令行,但如果你想摆脱其不是都是“级”或“分数”,你可以打开vim和运行

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

为了消除打头的行连续两行“得分”以下以“得分”开头的行,和

:%s/grade.*\zs\n.*grade.*$// 

为了消除在其中具有“级”行以下与“在它级的线。

相关问题