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
).
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.
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)