2013-04-17 46 views
3

處理我想二維陣列,在下面給出一個簡單的awk腳本:二維數組中AWK

BEGIN{ 
    b[1][1]=0 
    split("5 4 3 2",b[1]) 
    print b[1][1] 
} 

這段代碼在GNU gawk的教程中也有提及。但是當我試圖運行這個時,我得到了b的索引的語法錯誤。任何人都可以告訴問題是什麼?在gnu教程中他們已經顯示了輸出。

+1

你使用的是GNU awk嗎? – Scrutinizer

+0

@Scrutinizer +1和:-) –

+1

請注意,像上面這樣的真正的二維數組只能在較新版本的gawk中使用,所以即使您使用的是gawk,它也可能不支持該語法。 –

回答

7

修訂

普通awk使用b[1,1]語法,但它不是一個真正的二維數組。而不是散列,像1 SUBSEP 1這樣的元素。所以如果你使用for (i in b) print i那麼你會有這樣的指數。 SUBSEP的默認值是0x34,但可以重新定義。

split無法定義數組元素。但你可以移動到一個正常的變量,並用for循環填充b。讓我們嘗試:

BEGIN{ 
    #b[1,1] is automatically created if referenced, even by a read. 
    split("5 4 3 2",b[1]); 
    print b[1,1]; 
} 

說: 「AWK:./x.awk:5:致命的:分裂:第二個參數是不是數組」

下一個嘗試:

BEGIN{ 
    split("5 4 3 2",a); 
    b[1] = a; 
    print b[1,1]; 
} 

都能跟得上。錯誤:「awk:./x.awk:5:fatal:嘗試在標量上下文中使用數組'a'

什麼您可以用來將分割的結果存儲在數組中,然後將其複製到2D像圖:

BEGIN{ 
    split("5 4 3 2",a); 
    for(i in a) b[1,i]=a[i]; 
    print b[1,1]; 
} 

請注意,b不是真正的2D陣列。現在它有4個這樣的元素:b[1 SUBSEP 1] == 5,b[1 SUBSEP 2] == 4 & c。

如果你想轉儲是的值,你可以創建兩個循環或只有一個,如:

for (i in b) print i" => "b[i]; 

輸出:

11 => 5 
12 => 4 
13 => 3 
14 => 2 

如果你想看到的分離器,其設置爲可見的東西:

BEGIN{ 
    SUBSEP=":" 
    split("5 4 3 2",a); 
    for(i in a) b[1,i]=a[i]; 
    print b[1,1]; 
    print b[1 SUBSEP 1]; 
    for (i in a) print "a-"i" => "a[i]; 
    for (i in b) print "b-"i" => "b[i]; 
} 

輸出:

5 
5 
a-4 => 2 
a-1 => 5 
a-2 => 4 
a-3 => 3 
b-1:1 => 5 
b-1:2 => 4 
b-1:3 => 3 
b-1:4 => 2 

正如你所看到的散列元素不是按數字順序打印的。我很驚訝b這樣打印。但是你不能相信這一點(請參閱a元素)。

ADDED

我檢查與 3.1.5和b[1][1]split("5 4 3 2",b[1])符號不工作(如預期)。我也試過 4.1.0,兩者都在工作!看來在較新的b[1][1]=0定義了一個數組b[1]所以split("5 4 3 2",b[1])可以工作。但b[1,1]=0行爲不同。它的行爲方式是舊的,所以b[1]不是一個真正的數組(因爲沒有這樣的元素,而是b[1 SUBSEP 1])。

因此,請嘗試awk --version檢查版本並使用舊語法,因爲看起來您的對於新語法來說太舊了。

+0

+1清楚地解釋了 – Kent

+1

注意到對於(i in a)b [i(i = 1; i <= n; ++ i)b [1,i] = a [i] 1,I] = A [1]'。對於這個例子,它們在功能上是等價的,但是如果在「a」的指數中可能存在空白,則後者是正確的選擇。 –

+1

@Ed Morton:你說得對!代碼修改!謝謝! – TrueY