Eu tenho um seguinte 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 leitura $2
e $5
colunas.
Eu gostaria de encontrar todos os valores da 5ª coluna que são diferentes para o mesmo valor da 2ª 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 canais, idealmente usando Bash e Awk como script ou na 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 2ª coluna fornecida. Além disso, a última linha não é considerada na conta ( XYZ
).
Também posso escrever o seguinte no 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 válidos e esperados são:
- Linhas com
R:123-123
, porque recebem dois parâmetros diferentes:AAA
,XYZ
. - Linhas com
R:123-126
, porque recebem dois parâmetros diferentes:DDD
,EEE
. - Linhas com
R:123-456
, porque recebem dois parâmetros diferentes:XXX
,YYY
.
Como isso pode ser alcançado de forma mais eficiente?
Awk
+sort
solução:A saída: