Como encontrar linhas com valores diferentes na quinta coluna que compartilham a mesma segunda coluna?

1

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?

    
por kenorb 02.03.2018 / 12:12

1 resposta

2
Solução

Awk + sort :

awk 'a[$2]++ && $5 != f5{ print r ORS $0 }{ r=$0; f5=$5 }' <(sort -k2,2 file)

A saída:

2018.03.02 R:123-123 [Debug] Parameters AAA ...
2018.03.02 R:123-123 [Debug] Parameters XYZ ...
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 ...
    
por 02.03.2018 / 12:44