带常量变量的awk开关盒

时间:2014-10-17 06:47:10

标签: gawk

我在gawk和switch case语句中遇到了一些问题。当我使用带有常量字符串的switch case时,每个东西都可以正常工作,但是我使用的是常量变量,而不是。

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

这个例子很好用:

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函数解析列名,并使用开关找到正确的位置。

1 个答案:

答案 0 :(得分:0)

这是一种使用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