Создать отчет из другого файла с помощью сценария оболочки - PullRequest
0 голосов
/ 05 марта 2020

У меня есть файл, содержащий значения ваучеров вместе с их статусом и счетчиком каждого значения ваучера в каждом статусе, например:

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

В первом столбце отображается значение ваучера, во втором столбце отображается состояние ваучера и 3-й столбец показывает количество ваучеров стоимости в ранее упомянутом статусе. Например: как показано в 1-й строке, у меня есть 17 ваучеров со значением 100 в D (детективное состояние), также во 2-й строке у меня есть 199 ваучеров того же значения (100), но в E-состоянии мне нужно сгенерировать отчет из этого ввода, но в другом формате, но сначала я должен разделить каждое значение в 1-м столбце на 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

последняя строка должна быть удалена

1 Ответ

2 голосов
/ 05 марта 2020

РЕДАКТИРОВАТЬ: Добавление решения, которое удаляет контрольные символы M из файла Input_file, если 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


Не могли бы вы попробовать следующее. Но не уверен, почему последняя строка 100000 отсутствует в выводе OP. Если вас не волнует последовательность данных.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...