删除与类似关键字行,如果它们出现在连续的行
问题描述:
我有以下格式删除与类似关键字行,如果它们出现在连续的行
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中有没有其他更好的命令,我们可以删除这样的连续行,它们有两行包含等级或分数。
答
这里是我的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
将打印整行。
答
不bash命令行,但如果你想摆脱其不是都是“级”或“分数”,你可以打开vim
和运行
:%s/^score.*\zs\nscore.*$//
为了消除打头的行连续两行“得分”以下以“得分”开头的行,和
:%s/grade.*\zs\n.*grade.*$//
为了消除在其中具有“级”行以下与“在它级的线。
非常感谢,它工作得很好。你能否提供解释如何工作 – Zoro99
当然。我会将其添加到我的答案中。 –