eine Frage zum fortgeschrittenen sortieren in der Bash.
Ich finde sort nicht gerade besonders trivial und wartungsfreundlich bei komplexeren suchen. Die Methode, die Programmiersprachen anbieten gefällt mir da viel besser, als die da wäre:
Schreibe eine Funktion, die entweder 0 bei Gleichheit, 1 wenn der erste Wert grösser ist und -1 wenn der 2. Wert grösser ist.
Beispiel in PHP:
Code: Alles auswählen
<?php
function cmp($a, $b)
{
return strcmp($a["frucht"], $b["frucht"]);
}
$fruechte[0]["frucht"] = "Zitronen";
$fruechte[1]["frucht"] = "Aepfel";
$fruechte[2]["frucht"] = "Orangen";
usort($fruechte, "cmp");
while (list($key, $value) = each($fruits)) {
echo "\$fruechte[$key]: " . $value["frucht"] . "\n";
}
?>
Die Aufgabe
Ausgangsdaten
Code: Alles auswählen
46.165.224.87 Status: FEHLER 421 Too many concurrent SMTP connections; please try again later.
209.58.136.65 Status: OK 220 mx59.antispamcloud.com ESMTP Exim 4.89-119784 Fri, 21 Jul 2017 18:44:59 +0200221
138.201.140.156 Status: OK 220 quarantine2.antispamcloud.com ESMTP Exim 4.89-119784 Fri, 21 Jul 2017 18:44:59 +0200221
199.115.117.7 Status: FEHLER 421 mx22.antispamcloud.com: Too much load; please try again later
95.211.160.147 Status: OK 220 master.antispamcloud.com ESMTP Exim 4.89-119784 Fri, 21 Jul 2017 18:44:59 +0200221
- Oberste Sortierebene(Status): FEHLER > OK
- Zweite Sortierebene(Servertyp): master > mx > quarantine
- Dritte Sortierebene(Serverindex): numerisch
- Werte die nicht vorhanden sind, sind mit unendlich gleichzusetzen(Sprich grösstmöglicher Wert; Siehe Zeile 1 Ausgangsdaten, Zeile 2 Ergebnisdarstellung)
- Komplette Gleichheit - die auftreten kann bei nicht vorhandenen Werten - kann ignoriert werden
209.58.136.65 Status: OK 220 mx59.antispamcloud.com ESMTP Exim 4.89-119784 Fri, 21 Jul 2017 18:44:59 +0200221
- Status OK
- Servertyp mx
- Serverindex 59
Code: Alles auswählen
199.115.117.7 Status: FEHLER 421 mx22.antispamcloud.com: Too much load; please try again later
46.165.224.87 Status: FEHLER 421 Too many concurrent SMTP connections; please try again later.
95.211.160.147 Status: OK 220 master.antispamcloud.com ESMTP Exim 4.89-119784 Fri, 21 Jul 2017 18:44:59 +0200221
209.58.136.65 Status: OK 220 mx59.antispamcloud.com ESMTP Exim 4.89-119784 Fri, 21 Jul 2017 18:44:59 +0200221
138.201.140.156 Status: OK 220 quarantine2.antispamcloud.com ESMTP Exim 4.89-119784 Fri, 21 Jul 2017 18:44:59 +0200221
Das ist die Sortierfunktion in PHP:
Code: Alles auswählen
function mysort($a,$b) {
list ($a_status,$a_code,$a_server_type,$a_servername_index) = parse_line($a);
list ($b_status,$b_code,$b_server_type,$b_servername_index) = parse_line($b);
if ( $a_status != $b_status ) {
$res = ($a_status == "OK") ? 1 : -1;
} else {
if ( $a_server_type != $b_server_type ) {
if($a_server_type=="master") $res = -1;
if($a_server_type=="mx" && $b_server_type=="quarantine") $res = -1;
if($b_server_type=="master") $res = 1;
if($b_server_type=="mx" && $a_server_type=="quarantine") $res = 1;
} else {
$res = ( $a_servername_index > $b_servername_index ) ? 1 : -1;
}
}
return $res;
}
h.