Eu não vejo por que você gostaria de fazer isso em um único comando awk
, o que você tem parece perfeitamente bem. De qualquer forma, aqui está uma maneira:
$ awk -F, '(max[$18]<$21 || max[$18]==""){max[$18]=$21;line[$18]=$0}
END{for(key in line){print line[key]}}' file
6598,6598,0,1,,1,0,1,1,0,0,0,1,0,0,0,0,1390,1390,,0.730000,
1297,1297,0,0,,0,0,1,0,0,0,0,0,1,0,1,0,1707,1707,,7.000000,
6553,6553,0,1,,1,0,1,1,0,0,0,0,1,0,1,0,4326,4326,,9.000000,
A ideia é muito simples. Temos duas matrizes, max
tem $18
como uma chave e $21
como um valor. Para cada linha, se o valor salvo para $18
for menor que $21
ou se não houver nenhum valor armazenado para $18
, então armazenamos a linha atual ( $0
) como o valor para $18
na matriz %código%. Finalmente, no bloco line
, imprimimos o array END{}
.
Observe que o script acima trata line
como uma string. Portanto, $18
e 001
serão considerados sequências diferentes.