2014-10-17 24 views
0

我有一些gawk开关盒语句的问题。当我用常量字符串使用switch case时,每件事情都可以正常工作,但是我使用了一个常量变量。具有常量变量的awk开关盒

为了更好的解释两个例子。

这个例子正常工作:

BEGIN { 
... 
} 
END { 
    split($0,a,", ") 

    for (k in a) 
    { 
    switch (a[k]) 
    { 
     case "COLUMN 1": 
     POSITION = k 
     print k,a[k] 
     break 
     default: 
     print "Error" 
     exit 
     break 
    } 
} 

这个例子给了我一个语法错误:

BEGIN { 
    COLUMN_NAME = "COLUMN 1" 
} 
END { 
    split($0,a,", ") 

    for (k in a) 
    { 
    switch (a[k]) 
    { 
     case COLUMN_NAME : #Syntax Error in this line 
     POSITION = k 
     print k,a[k] 
     break 
     default: 
     print "Error" 
     exit 
     break 
    } 
} 

我不知道,如果AWK使得COLUMN_NAME一个恒定的,但我没有找到任何办法强制这一点。 我甚至尝试使用if/else这两种情况下工作正常。

编辑: 下面是awk脚本应该做的解释。我有一个CSV文件看起来像这样:

COLUMN 1, COLUMN 2, COLUMN 3, COLUMN 4 
     1,  2,  3,  4 
     5,  6,  7,  8 
... 

但该文件甚至可以是这样的:

COLUMN 3, COLUMN 2, COLUMN 4, COLUMN 1 
     1,  2,  3,  4 
     5,  6,  7,  8 
... 

我知道列的名称,但我不知道现在的位置。所以我使用split函数解析列名,并使用开关来找到正确的位置。

+0

如果您发布了一些数据以及您想要从中获得什么,我们可能会创建另一个工作解决方案。 – Jotne 2014-10-17 07:31:46

+0

我添加了awk脚本应该提供的工作。 – 2014-10-17 07:49:41

回答

1

下面是使用阵列中awk

awk -F, 'NR==1 {for (i=1;i<=NF;i++) {split($i,t," ");c[i]=t[2]}} NR>1 {for (j=1;j<i;j++) arr[(NR-1)FS c[j]]=$j+0} END {print arr[2 FS 1]}' file 

梳理出来的方式然后END打印第二行,第1列
这将为第一文件给出第二文件

5
8

更易读:

awk -F, ' 
NR==1 {        # get the column order 
    for (i=1;i<=NF;i++) {   # loop trough all fields 
     split($i,tmp," ")   # get the column number 
     col[i]=tmp[2]}    # store the column order in col 
    } 
NR>1 {        # for all data do: 
    for (j=1;j<i;j++)    # loop trough all element 
     arr[(NR-1)FS col[j]]=$j+0} # store data in array arr 
END { 
    print arr[2 FS 1]}    # print data from row 2 column 1 
' file