2016-09-02 39 views
5

Próbuję abuse asort() (właśnie dlatego), aby skopiować tablicę src do tablicy dest, nie ma problemu:asort (src, dest) do tablicy wielowymiarowej

$ awk 'BEGIN { 
    split("first;second;third",src,";") # make src array for testing 
    asort(src, dest, "@ind_num_asc") # copy array to dest 
    for(i in dest) 
     print i, src[i], dest[i]  # output 
}' 
1 first first 
2 second second 
3 third third 

Ale czy istnieje sposób użycie tablica wielowymiarowa jako macierz dest? Coś jak:

asort(src, dest[src[1]], "@ind_num_asc") # or dest[src[1]][]

(dawny produkuje second argument not an array, ostatni syntax error W rzeczywistości pierwszy argument split jest $0 i próbuję zapisów grupowych).

Oczywiście mógłbym użyć for pętlę ale mój mózg utknął w testowaniu tego rozwiązania.

+0

Najśmieszniejsze jest to, że jeśli zdefiniować tablicę wcześniej z 'dest [„pierwszy”] [1] =„”' to wtedy daje „fatal: spróbuj użyć tablicy "dest [" pierwszy "]" w kontekście skalarnym ". Ciekawe, aby przeczytać ostatnią część [GNU awk na tablicy macierzy] (https://www.gnu.org/software/gawk/manual/html_node/Arrays-of-Arrays.html): _Reklamować odniesienie do niezainicjowanego element array daje wartość "", łańcuch pusty. Ma to jedną ważną implikację, gdy zamierzasz użyć pod-kolumny jako argumentu dla funkcji. – fedorqui

+0

Tak, naprawdę nie jest niezgodny w odniesieniu do tego przykładu i 'asort'. Grałem z 'split'ting na' dest ["tmp"] ', ale' asort' nadal nie jest zbyt chętny. –

+0

Funkcje "asort()" i "split()" są spójne i zachowują się dokładnie [jako dokument] (https://www.gnu.org/software/gawk/manual/gawk.html#Arrays-of-Arrays), nie wiem skąd pochodzi nieporozumienie/zamieszanie. –

Odpowiedz

3

Wystarczy utworzyć tablicę pod dest[src[1]] pierwszy tak gapić wie, że dest[src[1]] jest tablicą tablic zamiast domyślnej tablicy ciągów:

$ cat tst.awk 
BEGIN { 
    split("first;second;third",src,/;/) # make src array for testing 

    asort(src, dest1d)    # copy array to dest1d 
    for(i in dest1d) 
     print i, src[i], dest1d[i]  # output 
    print "" 

    dest2d[src[1]][1] 
    asort(src, dest2d[src[1]])   # copy array to dest2d 
    for(i in dest2d) 
     for (j in dest2d[i]) 
      print i, j, dest2d[i][j] # output 
} 

$ gawk -f tst.awk 
1 first first 
2 second second 
3 third third 

first 1 first 
first 2 second 
first 3 third 

To nie ma znaczenia, co indeks dajesz że początkowa pod-tablica, ponieważ zostanie usunięta przez sort(). Patrz ostatniej przykład w https://www.gnu.org/software/gawk/manual/gawk.html#Arrays-of-Arrays:

Przypomnijmy, że odniesienie do niezainicjowanego elementu macierzy daje wartość o „” zerowa łańcucha. Ma to tę jedną ważną wpływu gdy zamierza użyć subarray jako argumentu w funkcji jako przedstawionego przez następujący przykład:

$ gawk 'BEGIN { split("a b c d", b[1]); print b[1][1] }' 
error→ gawk: cmd. line:1: fatal: split: second argument is not an array 

sposób pracy na to jest pierwsza siła B [1] być tablicą przez tworząc dowolny indeks:

$ gawk 'BEGIN { b[1][1] = ""; split("a b c d", b[1]); print b[1][1] }' 
-| a 
+2

Dziękuję, proszę pana!/θ –