2017-10-14 6 views
0

を表示された場合、我々は4行目と5行目の両方を見ての通り、私は次の形式彼らは連続した行に

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 

のテキストファイルを持っている類似のキーワードで行を削除スコアとグレードラインはライン5の前に失われてい私は、しかし、これはグレードが欠落している行だけをフィルタリングします-A 1

file.txtを

はgrep 'グレード' と考えることができます。

一つの方法。グレードはそこにあるが、スコアが欠落している行はほとんどない。

unix/linuxには、グレードやスコアを含む2行の連続した行を削除できる他のコマンドがありますか?

答えて

1

私のawkのソリューション、このソリューションは、複数の類似した行が最後である場合、それは簡単にできる最後の出力1つの余分ライン意志であるマイナーなバグを持っていることを

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ワードを保存します。あなたのケースに連続する行がある場合、$ 2、$ 3、$ 4は前の行と同じになります。同じでない場合は、print $0が行全体を出力します。

+0

ありがとう、それは非常にうまくいった。どのように動作するのか説明をお願いします。 – Zoro99

+0

私はそれを私の答えに加えます。 –

0

ないbashのコマンドラインが、あなたは「グレード」や「スコア」のいずれかの両方を有する二つの連続した行を取り除くしたい場合は、vimを開き、で始まる行を排除するために

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

を実行することができますその中に「グレードライン以下にそれらの「グレード」を持っている行を削除するには、「スコア」で始まる行以下の「スコア」、および

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

。ここで