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
我正在将从银行收到的交易明细文件从固定宽度转换为 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