我有一个python代码,如果它们在颠倒时相似则会删除它们。例如,如果我有一个包含以下内容的文档:
1,2 3,4
5,6 7,8
2,1 4,3
5,6 8,7
执行脚本后,输出为
5,6 7,8
2,1 4,3
5,6 8,7
考虑第一列是1,2,第二列是7,8表示一行,如果另一行包含每列的反转值,则为2,1和8,7这被视为反转。
但是,我注意到脚本没有保持行的顺序。线条顺序对我很重要。此外,我需要删除第二个类似的反向行,而不是第一个。代码是
import sys
with open(sys.argv[1]) as inf:
keys = set()
for line in inf:
ports, ips = line.split()
port1, port2 = ports.split(",")
ip1, ip2 = ips.split(",")
if ip1 < ip2:
keys.add((ip1, port1, ip2, port2))
else:
keys.add((ip2, port2, ip1, port1))
with open('results', 'w') as outf:
for result in keys:
outf.write("{1},{3}\t{0},{2}\n".format(*result))
有什么想法吗?如果我们可以在bash脚本上做任何建议吗?
由于
答案 0 :(得分:2)
您可以在此处使用collections.OrderedDict
:
>>> from collections import OrderedDict
>>> dic = OrderedDict()
with open('file.txt') as f:
for line in f:
key = tuple(tuple(x.split(',')) for x in line.split())
rev_key = tuple(x[::-1] for x in key)
if key not in dic and rev_key not in dic:
dic[key] = line.strip()
...
>>> for v in dic.itervalues():
print v
...
1,2 3,4
5,6 7,8
5,6 8,7
答案 1 :(得分:1)
由于您提到了bash
,因此这是一个awk
解决方案
awk -F'[ ,]' 'BEGIN{OFS=","} {$1=$1};
!($0 in arr){print($1,$2" "$3,$4);arr[$2","$1","$4","$3]}' file.txt
1,2 3,4
5,6 7,8
5,6 8,7