awk標題說明了一切:當我通過附加元素使用自然(基于一的)數字作為索引構造陣列時,我可以使用for (VAR in ARRAY)正確的順序(即添加元素的順序)來獲取陣列元素嗎?
由于陣列awk是關聯的,問題是迭代是否會使用foreach (@array)Perl 中給出的順序,或者更可能使用 Perl 中給出的順序while (my ($k, $v) = each %hash)(也在 Perl 中)。后者可以是任何順序。
gawk手冊指出:
關于陣列要記住的一個重要方面是陣列下標始終是字串。當數值用作下標時,它在用于下標之前被轉換為字串值。
我知道我可以構造一個for回圈來計算 中的索引awk,但我仍然想知道。
uj5u.com熱心網友回復:
是什么in the correct order?數值上升?數值遞減?先入為主?按字母升序(因為陣列索引始終是字串,而不是數字)?還有什么?
關鍵是通常沒有“正確的順序”,因此在所有腳本中沒有特定的順序是“正確的”,以便 awk 訪問其中的索引,因此每個 awk 都可以盡可能高效地訪問索引。
例如,如果您有一組從 1 開始的數字索引,但您不知道最大值并且希望按升序訪問它們,例如,您可以執行以下操作:
for (i=1; i in array; i ) {
print array[i]
}
否則撰寫您自己的跟蹤順序的方式,例如以第一順序獲取它們(假設所有唯一索引):
order[ numIndices] = $1
array[$1] = $2
...
for (o=1; o<=numIndices; o ) {
i = order[o]
print array[i]
}
或將 GNU awk 用于PROCINFO["sorted_in"]但即使如此,您仍然必須撰寫自己的跟蹤優先順序的方式。
uj5u.com熱心網友回復:
當使用自然數作為陣列索引時,會
for (VAR in ARRAY)以正確的順序迭代嗎?
GNUAWK手冊的Scanning an Array提到了這種情況for
此陳述句訪問陣列元素的順序由陣列元素的內部排列決定
awk,標準awk中無法控制或更改。 如果通過回圈體中的陳述句將新元素添加到陣列中,這可能會導致問題;for回圈是否會到達它們是不可預測的。同樣,在回圈內更改var可能會產生奇怪的結果。最好避免這樣的事情。作為資訊點,
gawk在回圈開始之前設定要迭代的元素串列,并且不更改它。但并非所有awk版本都這樣做。
因此,如果問題與 GNU 相關,AWK則答案是強制執行了某些順序,如控制掃描中所述,可能會更改(已選擇),但是如果它與其他awk版本有關,則在使用時不得假設陣列遍歷的特定順序for。
uj5u.com熱心網友回復:
GNU awk 和 POSIX awk 都宣告默認陣列遍歷是任意順序的。
來自OpenGroup POSIX awk 檔案:
for (variable in array)
which shall iterate, assigning each index of array to variable
in an unspecified order.
來自GNU awk 手冊:
默認情況下,當 for 回圈遍歷陣列時,順序是未定義的,這意味著 awk 實作決定了遍歷陣列的順序。此順序通常基于陣列的內部實作,并且從一個版本的 awk 到下一個版本會有所不同。
也就是說,某些版本的 GNU 實際上似乎是按插入順序遍歷的。
這是 GNU awk:
echo 'a
b
c
d' | gawk '{arr[$1]} END{for (e in arr) print e}'
印刷:
a
b
c
d
VS BSD awk:
echo 'a
b
c
d' | awk '{arr[$1]} END{for (e in arr) print e}'
印刷:
d
a
b
c
即使您的 awk似乎使用插入順序,也不能保證它在所有情況下都會使用,并且您不應該指望這種行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/454356.html
下一篇:使用陣列的一些鍵格式化物件
