Mon, October 6, 2008
重複行を削除するjythonコード uniq.py
Linuxには、uniq というコマンドがあり、これは重複した行を削除します。
$ cat sample.txt | sort | uniq
のように使うことで、 テキストファイル中の重複のある行を削除することができます。
しかし、わたしが使っているLinux(Vine)では、どうも uniq がユニコードに 対応していないようで、UTF-8 の文字コードのファイルを uniq を 使って処理しても、うまく重複した行を削除してくれません。
そこで、今回 jython で取り急ぎ uniq コマンドの代わりになる uniq.py というコードを作成しましたので、メモしておきます。 (ただし、これは UTF-8 だけに対応しています。)
uniq.py
import java.io as io
import java.lang as lang
import java.util as util
ENC="UTF-8"
false=0
true=1
def toList():
list=util.ArrayList()
br=io.BufferedReader( io.InputStreamReader( lang.System.in,ENC ) )
while(true):
line=br.readLine()
if line==None:
break
list.add( line )
br.close()
return list
pw=io.PrintWriter( io.OutputStreamWriter( lang.System.out,ENC ) )
prev_line=None
for line in toList():
if line!=prev_line:
pw.println( line )
prev_line=line
pw.close()
使い方
$ cat sample.txt | sort | jython uniq.py
sample.txt
123
hogehoge
123
hoge
foo
foobar
結果
123
foo
foobar
hoge
hogehoge