linux - 如果它们出现在连续行中,则删除具有相似关键字的行

标签 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 中是否有任何其他更好的命令我们可以删除这样的连续行,其中有两行包含成绩或分数。

最佳答案

这是我的 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 将打印整行。

关于linux - 如果它们出现在连续行中,则删除具有相似关键字的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46744327/

相关文章:

linux - UNIX下如何将两个命令合二为一?

mysql - 如何在 bash 脚本中将变量传递给 SSH 命令

python - 提高 python 脚本的吞吐量

linux - 当位置存储在变量中时,为什么 bash 找不到文件?

android - 如何在 Android 旁边安装 Linux?

Mysql 语法错误在 'Ctrl-C' 第 1 行恢复 MysqlDump

linux - 提取复杂字符串的片段

linux - 防止 XKB 布局切换与快捷方式

linux - Bash:为什么对这个字符串进行 egrepping 会成功?

c - 如何在 C 中正确显示 groupID (GID)?