Sou eu novamente, o cara com os enormes comandos awk
de uma linha ... Esse é ainda mais longo:
awk -F, 'BEGIN{print"\"Source\",\"Duration Time\""}NR>1{gsub(/"/,"",);split(,hms,":");s=hms[1]*3600+hms[2]*60+hms[3];if(!((,"MAX")in a)||a[,"MAX"]<s)a[,"MAX"]=s;if(!((,"MIN")in a)||a[,"MIN"]>s)a[,"MIN"]=s}END{for(idx in a){split(idx,ipm,SUBSEP);if(ipm[2]=="MAX"){d=a[idx]-a[ipm[1],"MIN"];h=int(d/3600);m=int((d-h*3600)/60);s=d%60;printf("%s,\"%02d:%02d:%02d\"\n",ipm[1],h,m,s)}}}' fb.csv
Com seu arquivo de entrada fb.csv
da pergunta, a saída é assim:
"Source","Duration Time"
"157.240.10.23","00:00:12"
"157.240.10.18","00:00:00"
"157.240.10.13","00:00:00"
"10.0.138.163","00:00:37"
"192.168.137.174","00:00:42"
Explicação do comando:
Corremos awk
assim, definindo o separador de campos que delimita as colunas para ,
e usando o arquivo fb.csv
como entrada:
awk -F, '<COMMAND>' fb.csv
O comando awk
(espaço reservado <COMMAND>
acima) é este, após a formatação adequada:
BEGIN {
print "\"Source\",\"Duration Time\""
}
NR>1 {
gsub(/"/, "", )
split(, hms, ":")
s = hms[1]*3600 + hms[2]*60 + hms[3]
if ( !((,"MAX") in a) || a[,"MAX"] < s )
a[,"MAX"] = s
if ( !((,"MIN") in a) || a[,"MIN"] > s )
a[,"MIN"] = s
}
END {
for (idx in a) {
split(idx, ipm, SUBSEP)
if (ipm[2]=="MAX") {
d = a[idx] - a[ipm[1],"MIN"]
h = int(d / 3600)
m = int((d - h * 3600) / 60)
s = d%60
printf("%s,\"%02d:%02d:%02d\"\n", ipm[1] ,h ,m ,s)
}
}
}
-
O bloco
BEGIN
simplesmente imprime o novo cabeçalho CSV. -
O bloco
NR>1
é executado uma vez por linha no arquivo de entrada, exceto pela primeira linha que contém o cabeçalho. Cada linha é dividida na coluna IP () e na coluna de hora (
).
Nós processamos a coluna de tempo retirando as cotas com
gsub
e dividindo-as nos dois pontos em uma matrizhms
que contém as horas, minutos e segundos. Isso é usado para converter o registro de data e hora em segundos desde a meia-noite, armazenado ems
neste bloco.Em seguida, verificamos a matriz associativa se ainda não houver uma entrada com o IP da linha atual ou se a entrada tiver valores menores de tempo MÍNIMO ou maiores, e, nesse caso, ela será atualizada de acordo.
-
Finalmente, no bloco
END
, a matriz criada é avaliada e para cada IP nela, a diferença entre as marcações de hora MAX e MIN é calculada e salva comod
. Isso é convertido novamente em horas, minutos e segundos e é exibido corretamente formatado.