com awk
:
awk '!first[$3, $4]{ first[$3, $4]= $0 } { last[$3, $4]= $0 }
END{ for (x in last) print first[x] (last[x] != first[x]? ORS last[x]:"") }' infile
2018-05-24 23:58:12 8.8.8.8 8.8.4.4
2018-05-24 23:59:51 8.8.8.8 8.8.4.4
2018-05-24 23:57:30 1.1.1.1 8.8.4.4
2018-05-24 23:57:32 2.2.2.2 8.8.4.4
A matriz first
associada mantém a primeira linha ocorrida com a combinação de teclas da coluna 3 e da coluna 4, mas a matriz last
mantém a linha mais recente sempre com as mesmas chaves.
Após todas as linhas terem sido lidas, os valores em first
array são as linhas que ocorreram no primeiro (com diferentes colunas # 3, # 4) e os valores em last
são as linhas que ocorreram no último.
Em seguida, no END
, imprima os valores salvos em first
array e, em seguida, em last
.
Esse (last[x] != first[x]? ORS last[x]:"")
é usado para impedir a duplicação da linha quando essa é a única linha exclusiva sem combinação repetida de coluna3 e 4.