Eu tenho as seguintes file.log
:
2018.03.02 R:123-123 [Debug] Parameters AAA ...
2018.03.02 R:123-124 [Debug] Parameters BBB ...
2018.03.02 R:123-125 [Debug] Parameters CCC ...
2018.03.02 R:123-126 [Debug] Parameters DDD ...
2018.03.02 R:123-126 [Debug] Parameters EEE ...
2018.03.02 R:123-456 [Debug] Parameters XXX ...
2018.03.02 R:123-456 [Debug] Parameters YYY ...
2018.03.02 R:456-456 [Debug] Parameters ZZZ ...
2018.03.02 R:123-123 [Debug] Parameters XYZ ...
em que estou interessado principalmente em ler $2
e $5
colunas.
Gostaria de encontrar todos os valores da quinta coluna que sejam diferentes para o mesmo valor da segunda coluna.
Aqui está o que eu tenho:
$ awk '{print $5" "$2}' file.log | uniq -s3 -c | sort -nr | grep -vw 1
2 XXX R:123-456
2 DDD R:123-126
mas estou procurando uma maneira mais eficiente com menos pipes, idealmente usando Bash e Awk como o script ou a partir da linha de comando.
A saída pode ser semelhante ou pode imprimir as linhas inteiras também. O problema com a saída acima é que ela não exibe todas as ocorrências para a segunda coluna. Também a última linha não é levada para a conta ( XYZ
).
Eu também posso escrever o seguinte em Bash :
$ grep -f <(awk '{print $5" "$2}' file.log | uniq -s3 -c | sort -nr | grep -vw 1 | awk '{print $3}') file.log
2018.03.02 R:123-126 [Debug] Parameters DDD ...
2018.03.02 R:123-126 [Debug] Parameters EEE ...
2018.03.02 R:123-456 [Debug] Parameters XXX ...
2018.03.02 R:123-456 [Debug] Parameters YYY ...
mas o comando não imprime linhas com R:123-123
, em segundo lugar não é eficiente para arquivos maiores.
Os resultados esperados e válidos são:
- Linhas com
R:123-123
, porque eles têm dois parâmetros diferentes: AAA
, XYZ
.
- Linhas com
R:123-126
, porque eles têm dois parâmetros diferentes: DDD
, EEE
.
- Linhas com
R:123-456
, porque eles têm dois parâmetros diferentes: XXX
, YYY
.
Como isso pode ser alcançado com mais eficiência?