如果我们有输入
95 cpd-1 -3.21 ooo
56 cpd-1 1.21 ooo
77 cpd-1 2.2 ooo
93 cpd-2 2.0 oox
57 cpd-2 1.15 oox
85 cpd-3 -1.32 xxx
67 cpd-3 -2.22 xxx
58 cpd-4 0 oxo
65 cpd-4 1.23 oxo
我们希望根据以下规则将输入分成三个文件:
(1)如果列2中的行相同
(2)将这些行分为三类:第3列是(正面,负面)(正面,正面)(负面,负面)
(3)我们将第3列中的0计为“正”
(4)对于相同的第2列,它们的第1列肯定是不同的
(5)对于相同的第2列,它们的第4列肯定是相同的
我们唯一能想到的是计算减号“ - ”。在(正面,正面),(正面,负面),(负面,负面),没有。相应地减去= 1,2,3并基于此来做类别。
欲望输出是:(不需要打印出来((正面,正面))等等。
(正,正)
93 cpd-2 2.0 oox
57 cpd-2 1.15 oox
58 cpd-4 0 oxo
65 cpd-4 1.23 oxo
(正,负)
95 cpd-1 -3.21 ooo
56 cpd-1 1.21 ooo
77 cpd-1 2.2 ooo
(负,负)
85 cpd-3 -1.32 xxx
67 cpd-3 -2.22 xxx
我们希望看看是否有任何评论/解决方案或内置bash / awk / python / perl / etc。功能可以做到这一点,我们不知道。谢谢!
答案 0 :(得分:1)
我认为您需要执行两阶段过滤器,因为您需要按列2执行初始分组,然后检查第3列的值。初始分组应填充字典,可能是第2列值可能会有很大差异:
grouped_rows = {}
for row in rows:
second_column = row.split(" ")[1]
if second_column in grouped_rows:
grouped_rows[second_column].append(row)
else:
grouped_rows[second_column] = [row]
然后,您需要确定给定组中是否存在正值或负值:
def row_value(row):
return float(row.split(" ")[2])
for rows in grouped_rows.values():
has_positive = any([ row_value(row) >= 0 for row in rows ])
has_negative = any([ row_value(row) < 0 for row in rows ])
if has_positive and not has_negative:
write_rows(file_1, rows)
elif has_positive and has_negative:
write_rows(file_2, rows)
else:
write_rows(file_3, rows)