我有一个以下格式的文本文件
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中是否还有其他更好的命令,我们可以删除这些连续的行,这两行包含两行包含成绩或分数。
答案 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.*$//
要删除其中包含“成绩”的行,并在其中添加“成绩”。