【发布时间】:2022-02-12 02:07:27
【问题描述】:
我有以下数据:
cat st_in.txt
2015-01-01 2 A FI
2015-02-03 4 B VI
2015-03-01 6 A FI
2015-01-08 -4 C VE
2016-01-05 -3 B VE
2016-02-03 -1 D FE
2016-04-01 -2 B FE
2016-06-13 -5 D VE
2017-01-01 2 A VI
2017-02-03 3 A VI
2017-02-04 8 C FI
2017-01-05 -1 B FE
我想这样输出数据(当然不用cmets):
2015 2016 2017 # ...
A 0 0 5 # $2>0 && $4~/VI/ Ordered alphabetically asc
B 4 0 0 # . .
sumVI 4 0 5
A 8 0 0 # $2>0 && $4~/FI/ .
C 0 0 8 # . .
sumFI 8 0 8
sumI 12 0 13 # sumI=sumFI+sumVI
B 0 -3 0 # $2<0 && $4~/VE/ .
C -4 0 0 # . .
D 0 -5 0 # . .
sumVE -4 -8 0
B 0 -2 -1 # $2<0 && $4~/FE/ .
sumFE 0 -2 -1 # .
sumE -4 -10 -1 # sumE=sumFE+sumVE
NET 8 -10 12 # NET=sumI+sumE
我是 awk 的新手,不知道如何处理这个问题。我在 gnu.org awk 上阅读了关于多维数组和数组数组的手册,我认为我会在这里需要,但不完全理解它们是如何工作的。我可以这样做一年,但不是多年。请注意,st_in.txt 非常大,并且比本示例中的跨度更长。还有一个很好的资源,您可以推荐学习如何在 awk 中透视数据表。
这是我迄今为止所尝试的。然而这不起作用:
cat trans1
#!/usr/bin/env bash
awk '
BEGIN{OFS="\t"
cat[$3]
height[$4][$3] +=$2
width[substr($1,1,4)][$4][$3] +=$2
}
END{
PROCINFO["sorted_in"]="@ind_str_asc";
for (width in height){
for (cat in height[width]){
if($2>0 && $4~/VI/)
{print cat, height[width]}
else if($2>0 && $4~/FI/)
{print cat, height[width]}
else if($2<0 && $4~/VE/)
{print cat, height[width]}
else {print cat, height[width]}}}
}
' "${@:--}"
我收到以下错误:
awk: cmd. line:11: (FILENAME=st_in.txt FNR=12) fatal: attempt to use array `width' in a scalar context
【问题讨论】:
-
您是否偶然看到了诸如this one 之类的现有问题?如果是这样,您可能会考虑编辑您的问题并提及您在搜索时发现的内容以及为什么它在您的情况下不起作用,或者类似的内容。此外,如果您进行了任何编码尝试,您可能会考虑包含您的代码,即使它不起作用。
-
对不起,大卫,我一直很忙。我已经对我的代码进行了修正更新。
标签: awk