2016-09-02 18 views
5

Tôi đang cố gắng lợi dụng asort() (chỉ vì) để sao chép một mảng src để mảng dest, không có vấn đề đó:asort (src, dest) vào một mảng đa chiều

$ 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 

Nhưng lại có một cách sử dụng một mảng đa chiều như mảng dest? Một cái gì đó như:

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

(cựu sản xuất second argument not an array, sau syntax error Trong thực tế đối số đầu tiên của split$0 và tôi đang cố gắng để hồ sơ nhóm.)

Dĩ nhiên tôi có thể sử dụng vòng lặp for nhưng não của tôi bị kẹt khi thử nghiệm giải pháp này.

+0

Funny điều là nếu bạn định nghĩa mảng trước với 'dest [ "đầu tiên"] [1] = ""' nó sau đó đưa ra một "chết người: cố gắng sử dụng mảng 'dest [" đầu tiên "] 'trong một bối cảnh vô hướng" lỗi. Thật thú vị khi đọc phần cuối cùng của [GNU awk trên mảng mảng] (https://www.gnu.org/software/gawk/manual/html_node/Arrays-of-Arrays.html): _Recall rằng tham chiếu đến một uninitialized phần tử mảng mang lại giá trị "", chuỗi rỗng. Điều này có một ý nghĩa quan trọng khi bạn dự định sử dụng một subarray như một đối số cho một function_. – fedorqui

+0

Vâng, thực sự không nhất quán về ví dụ đó và 'asort'. Tôi chơi xung quanh với 'split'ting để' dest ["tmp"] 'cũng nhưng' asort' vẫn chưa sẵn sàng. –

+0

Các hàm 'asort()' và 'split()' hoàn toàn nhất quán và hoạt động chính xác [như tài liệu] (https://www.gnu.org/software/gawk/manual/gawk.html#Arrays-of-Arrays), không chắc chắn nơi mà sự hiểu lầm/nhầm lẫn là đến từ. –

Trả lời

3

Bạn chỉ cần tạo một mảng dưới dest[src[1]] đầu tiên để trố mắt biết rằng dest[src[1]] là một mảng của mảng chứ không phải là mảng mặc định của chuỗi:

$ 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 

Nó không có vấn đề gì chỉ số bạn cho rằng ban đầu sub-array vì nó sẽ bị xóa bởi asort(). Xem ví dụ cuối cùng dưới https://www.gnu.org/software/gawk/manual/gawk.html#Arrays-of-Arrays:

Nhớ lại rằng một tham chiếu đến một phần tử mảng chưa được khởi tạo mang lại một giá trị của "", chuỗi null. Này có một ý nghĩa quan trọng khi bạn định sử dụng một mảng con như một tham số để một chức năng, như minh họa bằng các ví dụ sau:

$ 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 

Cách để làm việc xung quanh này là lực lượng đầu tiên b [1] để là một mảng của tạo ra một chỉ số tùy ý:

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

Cảm ơn bạn!/θ –