以前、ワンライナーに関する記事(http://d.hatena.ne.jp/niming538/20080329)で、rubyで空白行の重複を削除するというのを紹介しましたが、その例では空白だけでなく同じ行の重複も削除されてしまっていたので、考え中です。
ruby -e'text = [];last=""; while gets;text.push($_) if $_!=last; last = $_; end;puts text' temp.txt
解説:textという空のarrayを作って、一行ずつ前の行と比べながら、収納(push)していく。ファイル全部やり終わってから、アウトプット。
無理にワンライナーにしようとするから間違えるので、ふつーに考える。
File.open(ARGV[0]){ text=[] last="" while gets if $_!=last || $_!="\n" text.push($_) end last = $_ end puts text }
さて、これをワンライナー化するのがけっこう手間取りました。ウィンドウズのコマンドプロンプトだからかもしれませんが、ifの中に二つ条件を入れたりができない。いろいろ工夫したのですが、最終的にはあまりきれいではありませんが、次のようになりました。
ruby -e 'text=[];last="";while gets; text.push($_) if $_!=last; $_=="\n" ? last=$_: last=""; end; puts text' temp.txt
以上
追記:上記の条件式がわかりにくかったので書き直しました。
File.open(ARGV[0]){ text=[] last="" while gets if !($_==last and $_=="\n") text.push($_) end last = $_ end puts text }
条件式のところは、こう読みます。「一行取り出し、それが空白行でかつ前の行も空白行だったら飛ばして、そうでなかったら出力用の配列にいれる」
これならそのままワンライナーになります。
ruby -e 'text=[];last="";while gets; text.push($_) if !($_=="\n" and $_==last); last=$_; end; puts text' temp.txt
成功ですね。
以上