2014-12-02 48 views
1

請考慮以下目前處於公共領域的功能。

function join(array, start, end, sep, result, i) 
{ 
    if (sep == "") 
     sep = " " 
    else if (sep == SUBSEP) # magic value 
     sep = "" 
    result = array[start] 
    for (i = start + 1; i <= end; i++) 
     result = result sep array[i] 
    return result 
} 

我想使用這個功能加入連續列如$2, $3, $4在開始和結束範圍是變量。

但是,爲了做到這一點,我必須首先使用類似下面的循環將所有字段轉換爲數組。

for (i = 1; i <= NF; i++) { 
    a[i] = $i  
} 

或者更短的版本,就像@StevenPenny提到的那樣。

split($0, a) 

不幸的是,兩種方法都需要創建一個新變量。

awk是否具有以數組的方式訪問列的內置方式,以便上述手動轉換不是必需的?

+2

你不能做'拆分($ 0,a)'嗎? – 2014-12-02 08:22:05

+0

@StevenPenny,絕對,我會編輯這個問題,但它仍然涉及到創建一個新的變量。 – merlin2011 2014-12-02 08:23:36

+2

@ merlin2011爲什麼你需要他們在一個數組?它們已經被設置爲可以循環的變量,並且由於awk中的所有變量都是全局變量,因此不需要將任何內容傳遞給函數,除非您希望函數具有唯一的數組,在這種情況下,您將無論如何需要創建一個新的變量。 – 2014-12-02 08:32:09

回答

0

沒有這樣的數組是defined in POSIX awk(唯一的數組類型特殊變量是ARGVENVIRON)。

gawk也不存在,雖然它增加了PROCINFO,SYMTABFUNCTAB特殊數組。您可以使用SYMTAB陣列在運行時檢查所有定義的變量和類型(呆子-4.1.0功能):

BEGIN { PROCINFO["sorted_in"]="@ind_str_asc" } # automagic sort for "in" 
{ print $0 } 
END { for (ss in SYMTAB) printf("%-12s: %s\n",PROCINFO["identifiers"][ss],ss) } 

(雖然你會發現SYMTABFUNCTAB本身從列表中失蹤,失蹤從--dump-variables,他們是由設計專門處理)。 gawk也提供了一些標準的可加載擴展,但是沒有實現這個特性(並且給定$0,$1 ...,NFOFS之間的動態關係,具有相同功能的數組實現起來有點棘手)。

正如Jidder所建議的,一種解決方法是完全跳過數組並使用字段。有沒有什麼特別的字段名,變量$n可以使用相同的文字像$1(只照顧像$(NF-1)表達式中使用大括號的優先級下面是一個fjoin功能,上田的作品,而不是一個陣列。

function fjoin(start,end,sep, result,ii) { 
    if (sep=="") sep=" " 
    else if (sep==SUBSEP) sep ="" 
    result=$start 
    for (ii=start+1; ii<=end; ii++) 
     result=result sep $ii 
    return result 
} 

{ print "2,4: " fjoin(2,4,":") } 

(這不把$0作爲一種特殊情況)

或者只是使用split()和快樂,呆子至少保證它的行爲與場分裂(假設沒有任何FSFIELDWIDTHS並可能IGNORECASE是b eing修改以改變行爲)。