2013-01-11 4 views
5

Ich habe versucht, ein Pseudo-multidimensionales Array in awk.mehrdimensionale Arrays in awk

# Calculate cumulative context score 

BEGIN { FS=OFS="\t" } 

{ 
     a[$2+FS+$7,$3]+=$6 
} 

END { for (i,j) in a 
     { print i,j,a[i,j] } 

} 

Ausgang:

awk: ccstscan.awk:9: END { for (i,j) in a 
awk: ccstscan.awk:9:   ^syntax error 

das ist, was in GNU awk Handbuch erwähnt wird:

To test whether a particular index sequence exists in a multidimensional array, use the same operator (in) that is used for single dimensional arrays. Write the whole sequence of indices in parentheses, separated by commas, as the left operand:

(subscript1, subscript2, ...) in array 

Ich habe versucht, das Skript Modifizieren eines True-mehrdimensionale Array zu erstellen:

BEGIN { FS=OFS="\t" } 

{ 
    a[$2+FS+$7][$3]+=$6 
} 

END { for i in a 
    { 
    for j in a[i] 
     { print i,j,a[i][j] 
     } 

    } 
} 

ich lief es mit gaffen. es gab auch einen Fehler:

gawk: ccstscan.awk:6: a[$2+FS+$7][$3]+=$6 
gawk: ccstscan.awk:6:   ^syntax error 
gawk: ccstscan.awk:9: END { for i in a 
gawk: ccstscan.awk:9:   ^syntax error 
gawk: ccstscan.awk:11: for j in a[i] 
gawk: ccstscan.awk:11:  ^syntax error 
gawk: ccstscan.awk:11: for j in a[i] 
gawk: ccstscan.awk:11:   ^syntax error 
gawk: ccstscan.awk:12:   { print i,j,a[i][j] 
gawk: ccstscan.awk:12:      ^syntax error 

was das richtige Format zu machen und scannen mehrdimensionale-assoziative Arrays

+1

die Schleife fehlt (und), es ist 'für (i in a)', nicht 'für i in a'. Außerdem erhalten Sie wahrscheinlich den ersten Syntaxfehler über die Array-Indizes, weil Sie ein älteres Gawk verwenden, wahre mehrdimensionale Arrays sind eine ziemlich neue Ergänzung. –

+0

Ich würde einen Link von Arrays von Arrays in gawk4 hinzufügen http://www.gnu.org/software/gawk/manual/html_node/Arrays-of-Arrays.html – Kent

Antwort

10

Wenn Sie die simulierte multidimensionalen Arrays verwenden, würde Ihre Schleife wie sein müssen diese:

END { 
    for (ij in a) { 
     split(ij,indices,SUBSEP); 
     i=indices[1]; 
     j=indices[2]; 
     print i,j,a[ij] 
    } 
    } 

(i,j) in a die Syntax funktioniert nur zum Testen, ob ein bestimmte Index in dem Array ist. Es funktioniert nicht für For-Schleifen, obwohl die For-Schleife eine ähnliche Syntax zulässt.

Für die wahren multidimensionalen Arrays (Arrays von Arrays), können Sie es wie folgt schreiben:

BEGIN { FS=OFS="\t" } 

{ a[$2+FS+$7][$3]+=$6 } 

END { 
    for (i in a) { 
    for (j in a[i]) { 
     print i,j,a[i][j] 
    } 
    } 
} 

jedoch Arrays von Arrays nur in gawk 4.0, hinzugefügt, so dass Ihre Version von gawk kann nicht unterstütze es.

Noch ein Hinweis: auf dieser Linie:

a[$2+FS+$7,$3]+=$6 

Es scheint, wie Sie versuchen, $ 2 verketten, FS und $ 7, aber "+" ist für numerische aber auch nicht Verkettung. Sie müssten es so schreiben:

a[$2 FS $7,$3] += $6 
+2

+1 große Antwort. –