Identifique linhas que estão fora de ordem

3

Eu tenho um processo que gera saída principalmente em ordem ordenada lexicograficamente de acordo com um campo (timestamp), mas ocasionalmente as linhas serão exibidas na ordem errada:

2014-08-14 15:42:02.019220203 ok
2014-08-14 15:42:03.523164367 ok
2014-08-14 15:42:04.525655832 ok
2014-08-14 15:42:06.523324269 ok
2014-08-14 15:42:05.930966407 oops
2014-08-14 15:42:07.643347946 ok
2014-08-14 15:42:07.567283110 oops

Como posso identificar cada local onde os dados são "não classificados"?

Saída esperada (ou similar):

2014-08-14 15:42:05.930966407 oops
2014-08-14 15:42:07.567283110 oops

Eu preciso de uma solução que funcione conforme os dados são gerados (por exemplo, em um pipeline); é menos útil se apenas operar em arquivos completos. sort --check seria ideal, mas só gera o ponto de desordem primeiro ; Eu preciso de uma listagem completa.

    
por ecatmur 14.08.2014 / 16:58

2 respostas

4
awk 'NR>1 && $0"" < last; {last=$0}'

Imprime as linhas que ordenam antes da linha anterior. O $0"" é forçar a comparação lexical (na saída de seq 10 , ele localizaria 10 como classificação antes de 9 ).

    
por 14.08.2014 / 17:11
1

Eu acho que as comparações de string da shell devem respeitar a ordem lexicográfica (de acordo com a localidade atual, é claro) - então talvez você possa fazer algo como

#!/bin/bash

lastline=""
while IFS= read -r line; do 
  [[ "$line" < "$last" ]] && printf '%s\n' "$line"
  last="$line"
done < <(your process)
    
por 14.08.2014 / 17:16