gawk FIELDWIDTHS 转换为 CSV,但某些字段将美分转换为美元

gawk FIELDWIDTHS convert to CSV, but convert cents to dollars for some fields

我正在将从银行收到的交易明细文件从固定宽度转换为 CSV 文件。

 gawk '=' 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  >> $csvfilename

一些字段是货币字段并以美分列出。 例如,倒数第二个字段的值为“1234567”。 然而,我想要输出的值是“12345.67”。

我正在寻找如何进行这种转换。像

FIELDWIDTHS='1 8 12 23 6 6 6 7.2 13 '

举个例子。收到以下输入

1000000000000027302080000000541282******876421111821111821111800648300000000021687000000000PU 831712 DR90 020N000000000323132106663755
0000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

生成的 CSV 文件是

1,00000000,000002730208,0000000448387******6098,211115,211116,211116,0120456,0000000051580,000000000,PU ,754045 , ,DR,90 ,0,20N,0,0,00,000003,211,31912995587 , , 0,0,00,000000000,0000000000000000000,0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

第 8 个字段的值为“0120456”。 我希望生成的逗号分隔文件中的值显示为“01204.56”

这是我认为您可以使用或改编的解决方案。

Bash 脚本:

#!/bin/bash

line="1000000000000027302080000000541282******876421111821111821111800648300000000021687000000000PU 831712     DR90 020N000000000323132106663755 0000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"

echo "$line" | awk -f so.awk

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; i<=7; i++) {
        printf "%s,", $i
    }

    # Print 8th field
    firstXchars = substr(, 0, length()-2)
    lasttwochars = substr(, length()-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; j<=NF-1; j++) {
        printf "%s,", $j
    }

    # Print the last field
    print $NF
}

它的作用

  • 打印由 , 分隔的前 7 个字段,没有变化
  • 对于第8个字段,提取字符除了最后两个
  • 对于第8个字段,提取最后两个字符
  • (except last two).(last two),
  • 打印字段 8
  • 打印所有剩余字段,但最后一个字段由 ,
  • 分隔
  • 打印最后一个字段

输出

$ ./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 的方法,您可以调整脚本以满足您的实际数据和输出要求。

听起来这就是你想要做的事情:

$ cat file
foo12345bar

$ awk -v FIELDWIDTHS='3 5 3' -v OFS=',' '{sub(/..$/,".&",)} 1' file
foo,123.45,bar