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