Linuxのuniqコマンドに相当するコードをPythonで実装してみました。オプションは-c、-u、-d実装しました。
.
├── uniq.py
├── test.txt
uniq.py
import sys
def uniq(f):
previous_line = ""
for line in f.readlines():
if previous_line == line:
continue
print(line, end="")
previous_line = line
def uniq_c(f):
previous_line = ""
count = 1
for line in f.readlines():
if previous_line == "":
previous_line = line
continue
if previous_line == line:
count += 1
continue
print("{} {}".format(count, previous_line), end="")
previous_line = line
count = 1
print("{} {}".format(count, previous_line), end="")
def uniq_u(f):
previous_line = ""
is_unique = True
for line in f.readlines():
if previous_line == "":
previous_line = line
continue
if previous_line == line:
is_unique = False
continue
if is_unique:
print(previous_line, end="")
previous_line = line
is_unique = True
if is_unique:
print(previous_line, end="")
def uniq_d(f):
previous_line = ""
is_repeated = False
for line in f.readlines():
if previous_line == "":
previous_line = line
continue
if previous_line == line:
is_repeated = True
continue
if is_repeated:
print(previous_line, end="")
previous_line = line
is_repeated = False
if is_repeated:
print(previous_line, end="")
func_dictionary = {"-c": uniq_c, "-u": uniq_u, "-d": uniq_d}
try:
if len(sys.argv) > 1:
f = open(sys.argv[-1], "r")
if len(sys.argv) == 2:
uniq(f)
elif len(sys.argv) == 3:
if func_dictionary.get(sys.argv[1]):
func_dictionary.get(sys.argv[1])(f)
else:
print("args:[-c|-u|-d]")
else:
f = sys.stdin
uniq(f)
except FileNotFoundError:
print('Error: File {0} is not found.'.format(sys.argv[1]), file=sys.stderr)
sys.exit(1)
test.txt
aaa
bbb
aaa
aaa
AAA
以下が出力結果です。
$ python uniq.py test.txt
aaa
bbb
aaa
AAA
$ python uniq.py -c test.txt
1 aaa
1 bbb
2 aaa
1 AAA
$ python uniq.py -u test.txt
aaa
bbb
AAA
$ python uniq.py -d test.txt
aaa