2013-04-18 14 views
5

in definierter Reihenfolge druckt Ich habe es gegoogled und finde heraus, dass wir nach AWK 4.0 ein Array in definierter Reihenfolge drucken können, indem wir den Befehl PROCINFO ["sorted_in"] direkt vor for loop setzen. Zum BeispielWie man ein Array in AWK 3.1.3

PROCINFO["sorted_in"] = "@ind_num_asc" 
    for(i in array) 
      print i, array[i] 

In AWK 4.0.2 funktioniert es. Ich habe es jedoch in AWK 3.1.3 Umgebung versucht, es hat nicht funktioniert. Unterstützt diese frühe Version von AWK diese Funktion nicht? Wie erreicht man dieses Ziel in AWK 3.1.3?

+0

check out asort/asorti zum Sortieren eines Arrays – Laurijssen

+0

Nein, Nicht-GNU-AWWS und ältere Versionen von Gawk unterstützen diese Funktionalität nicht. Klären Sie "definierte Reihenfolge" und "dieses Ziel". Möchten Sie ein Array in einer bestimmten Reihenfolge drucken, und wenn ja, in welcher Reihenfolge (erste oder numerische Sortierung oder alphabetische Sortierung oder ...)? Alternativ suchen Sie nach einem Mechanismus, um verschiedene Anordnungen von Druckfeldern zu definieren, wie Sie in Ihrem Beispiel zeigen, indem Sie PROCINFO []? –

Antwort

4

Halten Sie einfach ein zweites Array order mit numerischen Indizes und den Schlüsseln für das erste Array als die Werte. Sie können dann durch order nacheinander durchlaufen und die Werte von array sehen:

for (i = 1; i < length(order); i++) { 
    print order[i], array[order[i]] 
} 

Wenn order bauen, können Sie überprüfen möchten, ob der Schlüssel bereits in array vorhanden ist, die Schlüssel des array werden mehrere gezeigt zu verhindern mal.

+0

Es gibt keine "length" Funktion in 3.1.3. Siehe Herrn Ventimiglias Funktion (mit meiner extensión) unter http://stackoverflow.com/questions/9351902/how-can-i-get-the-length-of- an-array-in-awk/19411381 # 19411381 oder behalte einfach den letzten Index bei der Erstellung von "order". –