Aproveitando a resposta do pfnuesel ,
{
split($3, a, "|")
split($4, b, "|")
if (a[2] > b[2]){
$3=b[1]"|"b[2]
$4=a[1]"|"a[2]
}
key=$3" "$4
split(arr[key], c, " ")
if ($8 > c[8] || ($8 == c[8] && $7 > c[7])){
arr[key] = $0
}
}
END{
for (item in arr){
print(arr[item])
}
}
Isso pressupõe, como mostrado (mas não explicitamente declarado) na pergunta,
que os valores nas terceira e quarta colunas são da forma
some_string | number
onde os espaços são apenas para ilustração,
e a string não contém nenhum caractere |
.
Esses tokens devem ser classificados com base nos valores do número s;
os prefixos string não são comparados.
Como na resposta do pfnuesel , o uso é
awk -f script.awk file1
O espaçamento exato do arquivo de entrada é perdido, mas um espaçamento de coluna legível pode ser (re) criado por meio de canalização em column -t
; por exemplo,
awk -f script.awk file1 | column -t > file2