2017-10-14 99 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.*$// 

爲了消除在其中具有「級」行以下與「在它級的線。

相關問題