我正在编写一个小shell脚本来列出CSV文件中的数据。 我得到了以下代码,实际上主要是做这个工作:
awk 'BEGIN{FS=OFS=";"} {
k = $7 FS $8 FS $14;
if($4=="coll"){
if($1=="2014")
a[k] += $3
else if($1=="2015")
b[k] += $3
else if($1=="2016")
c[k] += $3}
else{
if($1=="2014")
d[k] += $3
else if($1=="2015")
e[k] += $3
else if($1=="2016")
f[k] += $3}
}
END {
for (k in a) {
print k FS a[k] FS d[k] FS b[k] FS e[k] FS c[k] FS f[k];
}
}' $file1 > $file2
$ 4可以是两个值但可以在同一年使用多次,这就是为什么我使用带有k键的数组。字段$ 1是年份,但并非所有年份都有值,有时它们在$ 4上的“coll”值得到一个值,但对另一个值则没有。 3美元得到一个数值,我需要根据年份和$ 4字段值的具体总数,从那里所有这些if和else if语句。
我的所有记录都打印出来,直到我有2014年的东西。如果那个特定年份没有价值,我只是丢失了数据,即使2015年或/和2016年存在某些数据。
我不明白为什么,有人能告诉我光明吗?谢谢!
P.S。 :这是文件中的示例数据
2014;U;4;coll;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2014;U;11;adv;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2014;E;19;coll;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2014;E;164;adv;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2015;U;5;coll;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2015;U;70;adv;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2015;E;17;coll;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2015;E;205;adv;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2016;R;3;adv;sector;activity;REGION1;1A;;;;;;IND RET ORG HAG BIS;;;;;;;;;;;;;x
答案 0 :(得分:4)
你的循环说
for (k in a) {
所以你只会使用数组a[]
中存在的键值,即填充为:
if($4=="coll"){
if($1=="2014")
a[k] += $3
更改
k = $7 FS $8 FS $14;
...
for (k in a) {
为:
k = $7 FS $8 FS $14;
keys[k]
...
for (k in keys) {
所以你创建并稍后循环包含所有数组的所有索引的新数组keys[]
的索引。
实际上,你当然应该做这样的事情:
awk 'BEGIN{ FS=OFS=";" }
{
k = $7 OFS $8 OFS $14
keys[k]
foo[$4]
years[$1]
a[k,$4,$1] += $3
}
END {
for (k in keys) {
printf "%s", k
for (m in foo) {
for (year in years) {
printf "%s%s", OFS, a[k,m,year]
}
}
print ""
}
}'
或者甚至只是a[]
上的简单循环,具体取决于您需要的输出格式。