読者です 読者をやめる 読者になる 読者になる

rubyで空白行の重複を削除する(訂正)

Ruby


以前、ワンライナーに関する記事(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

成功ですね。

以上