#awk #currency-formatting
Вопрос:
Я конвертирую файл сведений о транзакции, полученный из банка с фиксированной шириной, в файл CSV.
gawk '$1=$1' FIELDWIDTHS='1 8 12 23 6 6 6 7 13 9 3 10 1 2 3 1 3 1 1 2 6 3 12 3 3 1 2 9 19 140 ' OFS=, $f gt;gt; $csvfilename
Некоторые поля являются полями валют и указаны в центах. Например, второе последнее поле будет иметь значение «1234567». Однако значение, которое я хочу вывести, — «12345,67».
Я ищу, как я могу осуществить это преобразование. Что-то вроде
FIELDWIDTHS='1 8 12 23 6 6 6 7.2 13 '
В качестве примера. получены следующие входные данные
1000000000000027302080000000541282******87642111182111111821111800648300000000021687000000000PU 831712 DR90 020N000000000323132106663755
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Полученный CSV-файл является
1,00000000,000002730208,0000000448387******6098,211115,211116,211116,0120456,0000000051580,000000000,PU ,754045 , ,DR,90 ,0,20 Н,0,0,00,000003,211,31912995587 , , 0,0,00,000000000,0000000000000000000,0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
8-е поле имеет значение «0120456». Я хотел бы, чтобы значение в результирующем файле, разделенном запятыми, гласило «01204.56».
Комментарии:
1. Спасибо за то, что поделились своими усилиями, не могли бы вы, пожалуйста, опубликовать образцы входных данных и ожидаемых результатов в своем вопросе, чтобы сделать его более понятным, спасибо.
2. Достаточно справедливо @Cyrus и ravinderSingh13. Я должным образом обновил свой вопрос, добавив дополнительную информацию о вводе и ожидаемых результатах.
3. Спасибо за добавление образцов, извините, но, похоже, это все еще не ясно. Не могли бы вы, пожалуйста, упомянуть логику получения вывода, которая сделает вопрос более ясным, ИМХО, ура.
4. Если я выполню вашу
gawk
команду на вашем примере вывода, я получу1,00000000,000002730208,0000000541282******8764,211118,211118,211118,0064830,0000000021687
. Не то, что вы указали в качестве результирующего CSV… Так что в этом вы хотели бы0064830
разделить на00648.30
?5. @Nic3500 есть несколько дополнительных полей, которые я вычислил из фактического значения ШИРИНЫ ПОЛЯ. Теперь я добавил полное, но да, в принципе, я хочу, чтобы одно из полей 0064830 было 00648,30 в CSV
Ответ №1:
Вот решение, которое, я думаю, вы можете использовать или адаптировать.
Сценарий Bash:
#!/bin/bash line="1000000000000027302080000000541282******876421111821111821111800648300000000021687000000000PU 831712 DR90 020N000000000323132106663755 0000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" echo "$line" | awk -f so.awk
так что … нехорошо
BEGIN { FIELDWIDTHS = "1 8 12 23 6 6 6 7 13 9 3 10 1 2 3 1 3 1 1 2 6 3 12 3 3 1 2 9 19 140" } { # Print first 7 fields for (i=1; ilt;=7; i ) { printf "%s,", $i } # Print 8th field firstXchars = substr($8, 0, length($8)-2) lasttwochars = substr($8, length($8)-1) printf "%s.%s,", firstXchars, lasttwochars # Print the rest of fields, except the last one (I do not want the , for the last one) for (j=9; jlt;=NF-1; j ) { printf "%s,", $j } # Print the last field print $NF }
Что он делает
- выведите первые 7 полей , разделенных
,
, без изменений - для 8-го поля извлеките символы, кроме двух последних
- для 8-го поля извлеките последние два символа
- поле печати 8 с
(except last two).(last two),
- выведите все остальные поля, кроме последнего, разделенного
,
- выведите последнее поле
Выход
$ ./so.bash 1,00000000,000002730208,0000000541282******8764,211118,211118,211118,00648.30,0000000021687,000000000,PU ,831712 , ,DR,90 ,0,20N,0,0,00,000003,231,32106663755 ,000,000,0,00,000000000,0000000000000000000,000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ^^^^^^^^
Примечание ^^^^^^^^
не является частью вывода, я просто выделяю поле 8
С помощью метода, выделенного здесь для управления полем 8, вы можете адаптировать сценарий в соответствии с вашими фактическими требованиями к данным и выводу.
Ответ №2:
Похоже, это то, что ты пытаешься сделать:
$ cat file foo12345bar $ awk -v FIELDWIDTHS='3 5 3' -v OFS=',' '{sub(/..$/,".amp;",$2)} 1' file foo,123.45,bar