Desde que eu não tenho uma vida tinha algum tempo de sobra, e desde que (aparentemente) nunca chego a aprender awk
corretamente, eu escrevi isso juntos para ver se eu seria capaz de resolvê-lo em Python.
Não tirar nada do awk
do @Kamaraj (votei positivo).
#!/usr/bin/env python3
colDict = {}
with open ("cols") as infile: # Open the file
for line in infile: # Read line by line
splitLine = line.split() # Split line into list
if splitLine[0] not in colDict: # Is value _not_ already in dict?
value = splitLine[0] # Create new value
colDict[value] = {} # Create nested dict
colDict[value]["Avg"] = float(splitLine[1]) # Insert 'avg'
colDict[value]["Count"] = 1 # Insert count
else: # Value _is_ in dict
colDict[value]["Avg"] += float(splitLine[1]) # Add 'avg' float value
colDict[value]["Count"] += 1 # Increment counter
print("Value\t\tAvg\tCount")
for value in sorted(colDict):
print("{0}\t{1:.2f}\t{2}".format(value,
colDict[value]["Avg"]/colDict[value]["Count"],
colDict[value]["Count"]))
Após a execução:
./parseCols.py
Value Avg Count
ACKR1/CCRL2 12.66 1
ACKR1/CMKLR1 10.41 1
ACKR1/CXCR4 13.01 1
ACKR1/FZD5 10.72 1
ACKR1/GPR107 10.22 1
ACKR1/GPR137 10.73 1
ACKR1/GPR146 11.93 1
ACKR1/TAPT1 11.24 1
ACKR1/TPRA1 11.81 1
ACKR1/XPR1 10.01 1
ACKR2/ACKR3 11.16 7
ACKR2/ADGRA2 9.02 3
A única diferença na saída é que o meu é classificado (em Value
) e que eu arredondo o Avg
em duas casas decimais.
novamente; crédito para @Kamaraj por escrever uma solução tão compacta em awk
!