tente (sendo seu arquivo)
sort -n -t\| -k2 -k1 < u |
awk -F\| '$1 < 8000 { a[$2]++ ; print }
$1 >= 8000 { if ( !a[$2] && ( !e[$2] || e[$2]<$8 )) {u[$2]=$0;e[$2]=$8;} ; }
END { for ( i in u ) print u[i] ;}'
dá
4000|1234||||||23
5000|1234||||||40
15000|456||||||29
9000|123||||||22
onde
-
-t\|
e-F\|
instruem o sort e o awk para usar|
como separador -
-k2
-k1
: classificar por segundo e, em seguida, primeiro campo -
|
na linha de ordenação deve ser o último caractere na linha -
$1 < 8000 { a[$2]++ ; print }
se abaixo de 8000, linhas de impressão e lembrar valor de $ 2 -
$1 >= 8000 { ... }
se acima, armazene o maior valor -
END { for ( i in u ) print u[i] ;}
ao sair, despejar todo o valor -
talvez seja necessário classificar novamente.
-
a condição da linha 2 pode ser simplificada (por ter condição fora de {})
-
alguma linha no seu teste tem 9 campos.
observe que o comando pode ser alinhado
... | sort -n -t\| -k2 -k1 | awk -F\| '...'