LoginSignup
2
0

More than 5 years have passed since last update.

2行同じ内容で続いたら削除するワンライナー

Last updated at Posted at 2017-04-01

テキストファイルに2行同じ内容が続いたら、その2行とも削除するワンライナーです。

perl -e 'while(<>){chop; if($a eq ""){$a = $_}elsif($a ne $_){print $a,"\n";$a=$_;}else{$a=""}} if($a ne ""){print $a,"\n"}'

たとえば、下記のテキストが与えられたとします。

A
A
B
C
C
C
D
D
D
D
E

以下の結果を得ます。

B
C
E

B と E は1行しか無いので残ります。
C は3つ続いているので、最初の2つが削除されて、1つ残ります。

これが必要になった状況はこんな感じでした。
2つのファイル b0.txt と b1.txt がありました。

b0.txt
A   
C   789
b1.txt
A   123
B   456
C   789

最初のカラムだけに着目して、b1.txt では B が追加されたことを知る必要がありました。
あてずっぽうなので、もっといいやり方があったかもしれませんが、とりあえず…

diff b0.txt b1.txt  | awk '($2!~/^$/){print $2}' 

といった処理をして、以下の結果を得ました。

A
A
B

両方のファイルに現れた A は連続して2回出現するので、それを削除できれば、一方のファイルにしか現れない B を特定できると考えた次第です。

しかし、この例なら、両方のファイルから、まず、1カラム目だけ抜き出して diff とればいいだけですね(汗) 実際はいろいろといじくり回した後の結果だったので、最適な手順をとれなかったといったところでしょうか。

【補足】 下記スクリプトは最初に投稿したものです
 
nakataSynsuke さんのご指摘のとおり、下記の記述から文字列比較の部分を修正したのが、現在、冒頭にあげているスクリプトになっています。

perl -e 'while(<>){chop; if($a =~ /^$/){$a = $_}elsif($a !~ $_){print $a,"\n";$a=$_;}else{$a=""}} if($a!~/^$/){print $a,"\n"}' 
2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0