【问题标题】:Generate report from a another file using shell script使用 shell 脚本从另一个文件生成报告
【发布时间】:2020-03-05 07:01:52
【问题描述】:

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

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

最后一行应该被删除

【问题讨论】:

  • 您能否详细说明为什么您的预期输出中不存在100000 6750 46162 2263 186 0 0 行?

标签: linux shell unix awk grep


【解决方案1】:

编辑:添加一个解决方案,从 Input_file 中删除控制 M 字符,以防 OP 在他/她的 Input_file 中有它。这将按需要 GNU awk 它使用 GNU awkPROCINFO["sorted_in"] = "@val_num_asc" 函数的排序顺序提供输出。

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

【讨论】:

    猜你喜欢
    • 2015-01-23
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2015-10-13
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    相关资源
    最近更新 更多