繁体   English   中英

使用 shell 脚本从另一个文件生成报告

[英]Generate report from a another file using shell script

我有一个文件包含凭证值及其状态以及每个状态下每个凭证值的计数,例如:

100 D 17
100 E 199
1000 E 109
10000 B 37
10000 D 116
10000 E 1365810
10000 R 61
10000 U 353829
10000 X 10
100000 B 2263
100000 D 6750
100000 E 46162
100000 R 186

第一列显示凭证价值,第二列显示凭证状态,第三列显示处于上述状态的凭证数量。 例如:如第一行所示,我在 D(侦探状态)下有 17 张价值 100 的凭单,同样,在第二行,我有 199 张价值相同(100)的凭单,但在 E 状态下我需要生成报告来自此输入但格式不同,但首先我必须将第一列中的每个值除以 100。我的最终报告应如下所示:

 Value  D    E       B    R  U    X
========================================
 100   17   199      0    0  0    0
 1000  0    109      0    0  0    0
 10000 116  1365810  37   61      353829 10

我的原始文件的内容是:

0 D 20
0 E 170
100000 B 2263
100000 D 6750
100000 E 46162
100000 R 186
100000 U 408
100000 X 11
10000 B 37
10000 D 116
10000 E 1365810
10000 R 61
10000 U 353829
10000 X 10
1000 E 109
100 D 17
100 E 199
150000 B 3
150000 D 13
150000 E 14
15000 B 98433
15000 D 7093493
15000 E 11483592
15000 R 326
15000 U 3510
15000 X 10
1500 E 3
20000 D 11
20000 E 26
2000 E 2
250000 B 63000
250000 D 24
250000 E 58952
250000 R 29
250000 U 58
250000 X 10
25000 B 622912
25000 D 2067757
25000 E 1909744
25000 R 26202
25000 U 254114
25000 X 15
2500 E 19
40000 B 3
40000 D 10
40000 E 27
500000 B 177
500000 D 8338
500000 E 514
500000 U 7
500000 X 10
50000 B 902
50000 D 281
50000 E 739597
50000 R 2249
50000 U 68466
50000 X 10
5000 B 197246
5000 D 27058176
5000 E 63687206
5000 R 610821
5000 U 6157692
5000 X 136
500 E 183
50 B 9
50 D 39427
50 E 2817
50 R 8
50 U 375
50 X 1
75000 B 2
75000 D 3
75000 E 36
7500 D 4108
7500 E 77
Recharge value Voucher state 1

最后一行应该被删除

编辑:添加一个解决方案,从 Input_file 中删除控制 M 个字符,以防 OP 在他/她的 Input_file 中有它。 这将在分拣需要GNU为了提供输出awk它使用PROCINFO["sorted_in"] = "@val_num_asc" GNU的功能awk

awk '
/^[a-zA-Z]+/{
  next
}
!a[$2]++{
  b[++count]=$2
}
!e[$1]++{
  c[++count1]=$1
}
{
  d[$1,$2]=$NF
}
END{
  for(k=1;k<=count;k++){
    header=(k==1?"Value":header)OFS b[k]
  }
  print header
PROCINFO["sorted_in"] = "@val_num_asc"
  for(j in c){
    for(i=1;i<=count;i++){
      if(i==1){
        printf("%d ",c[j]/100)
      }
      printf("%d %s",d[c[j],b[i]],i==count?ORS:OFS)
    }
  }
}
'  Input_file | column -t

输出如下。

Value  D         E         B       R       U        X
0      20        170       0       0       0        0
0      39427     2817      9       8       375      1
1      17        199       0       0       0        0
5      0         183       0       0       0        0
10     0         109       0       0       0        0
15     0         3         0       0       0        0
20     0         2         0       0       0        0
25     0         19        0       0       0        0
50     27058176  63687206  197246  610821  6157692  136
75     4108      77        0       0       0        0
100    116       1365810   37      61      353829   10
150    7093493   11483592  98433   326     3510     10
200    11        26        0       0       0        0
250    2067757   1909744   622912  26202   254114   15
400    10        27        3       0       0        0
500    281       739597    902     2249    68466    10
750    3         36        2       0       0        0
1000   6750      46162     2263    186     408      11
1500   13        14        3       0       0        0
2500   24        58952     63000   29      58       10
5000   8338      514       177     0       7        10


你能不能试试以下。 但不确定为什么 OP 的输出中没有最后一行100000 如果您不担心数据序列。

awk '
/^[a-zA-Z]/{
  next
}
!a[$2]++{
  b[++count]=$2
}
!e[$1]++{
  c[++count1]=$1
}
{
  d[$1,$2]=$NF
}
END{
  for(k=1;k<=count;k++){
    header=(k==1?"Value":header)OFS b[k]
  }
  print header
  for(j in c){
    for(i=1;i<=count;i++){
      if(i==1){
        printf("%d ",c[j]/100)
      }
      printf("%d %s",d[c[j],b[i]],i==count?ORS:OFS)
    }
  }
}
'  Input_file | column -t

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM