如何使用 awk windows 按固定位置生成文件
how to generate a file by fixed position with awk windows
我有一个在 unix 中开发的 awk 命令行,我必须将它传递给 windows。我已经为 windows 安装了 gawk 工具,我已经配置了我的环境变量,最后我将 shell 转换为批处理但是当我 运行 .bat 时它生成一个空文件。
这是我的代码:file.bat
echo off
set "fecha=%1"
set "inputpath=%2"
set "unique=.uq"
set file=FICUO%fecha%.txt
echo %fecha%
echo %file%
awk "{!x[,,,,,,,,]++}" FIELDWIDTHS="3 19 19 3 3 5 12 6 9 40 4 8 13 3 3 3 3 1 3 13 13 13 13 13 13 3 13 2 8 8 8 2 8 6 11 11 11 8 4" %inputpath%%file% > %inputpath%%file%%unique%
我假设问题是 FIELDWITHS 选项,我一直在研究它,我找到了如何指示字段的固定位置。
这是一个示例输入平面文件
2110004757960000000036000475796000332797200902200300000008067260007588013568776xxxxxxxxxxxxxxx 54112015123000000002621706040000080030000000000026217000000000327710000000032771000000000000000000000000000000000032771031000000000000025201603252016042000000000 20151230000000000000010000000000000000000001000000000000000
2310004757960000000036000475796000332797200902200300000008067260007588013568776xxxxxxxxxxxxxxx 54112015123000000002621706040000080040000000000026217000000000327710000000032771000000000000000000000000000000000032771030000000000000025201604252016052000000000 20151230000000000000010000000000000000000001000000000000000
知道我的错误是什么,所以它不会在输出文件中打印任何内容,谢谢
问题不在于 FIELDWIDTHS
,而是您的条件可能会触发隐藏在操作中的 print
。变化:
{!x[,,,,,,,,]++}
至:
!x[,,,,,,,,]++
因此结果被视为可以触发默认 print
操作的条件。我假设意图是从输入中打印唯一的行。 FWIW 我们惯用地将在该上下文中使用的数组命名为 seen
而不是 x
并且如果您在使用变量之前(即在脚本的开头)声明变量,它会使您的代码更容易理解,而不是比使用后:
awk -v FIELDWIDTHS="3 19 19 3 3 5 12 6 9 40 4 8 13 3 3 3 3 1 3 13 13 13 13 13 13 3 13 2 8 8 8 2 8 6 11 11 11 8 4" "!seen[,,,,,,,,]++" %inputpath%%file% > %inputpath%%file%%unique%
如果您希望输出为 tab-separated 个字段,则:
awk -v FIELDWIDTHS="3 19 19 3 3 5 12 6 9 40 4 8 13 3 3 3 3 1 3 13 13 13 13 13 13 3 13 2 8 8 8 2 8 6 11 11 11 8 4" -v OFS="\t" "{key= OFS OFS OFS OFS OFS OFS OFS OFS } !seen[key]++{print key}" %inputpath%%file% > %inputpath%%file%%unique%
抱歉,我不知道 windows 语法,所以希望您知道如果我的引号有误或其他原因该怎么办。
我有一个在 unix 中开发的 awk 命令行,我必须将它传递给 windows。我已经为 windows 安装了 gawk 工具,我已经配置了我的环境变量,最后我将 shell 转换为批处理但是当我 运行 .bat 时它生成一个空文件。
这是我的代码:file.bat
echo off
set "fecha=%1"
set "inputpath=%2"
set "unique=.uq"
set file=FICUO%fecha%.txt
echo %fecha%
echo %file%
awk "{!x[,,,,,,,,]++}" FIELDWIDTHS="3 19 19 3 3 5 12 6 9 40 4 8 13 3 3 3 3 1 3 13 13 13 13 13 13 3 13 2 8 8 8 2 8 6 11 11 11 8 4" %inputpath%%file% > %inputpath%%file%%unique%
我假设问题是 FIELDWITHS 选项,我一直在研究它,我找到了如何指示字段的固定位置。
这是一个示例输入平面文件
2110004757960000000036000475796000332797200902200300000008067260007588013568776xxxxxxxxxxxxxxx 54112015123000000002621706040000080030000000000026217000000000327710000000032771000000000000000000000000000000000032771031000000000000025201603252016042000000000 20151230000000000000010000000000000000000001000000000000000
2310004757960000000036000475796000332797200902200300000008067260007588013568776xxxxxxxxxxxxxxx 54112015123000000002621706040000080040000000000026217000000000327710000000032771000000000000000000000000000000000032771030000000000000025201604252016052000000000 20151230000000000000010000000000000000000001000000000000000
知道我的错误是什么,所以它不会在输出文件中打印任何内容,谢谢
问题不在于 FIELDWIDTHS
,而是您的条件可能会触发隐藏在操作中的 print
。变化:
{!x[,,,,,,,,]++}
至:
!x[,,,,,,,,]++
因此结果被视为可以触发默认 print
操作的条件。我假设意图是从输入中打印唯一的行。 FWIW 我们惯用地将在该上下文中使用的数组命名为 seen
而不是 x
并且如果您在使用变量之前(即在脚本的开头)声明变量,它会使您的代码更容易理解,而不是比使用后:
awk -v FIELDWIDTHS="3 19 19 3 3 5 12 6 9 40 4 8 13 3 3 3 3 1 3 13 13 13 13 13 13 3 13 2 8 8 8 2 8 6 11 11 11 8 4" "!seen[,,,,,,,,]++" %inputpath%%file% > %inputpath%%file%%unique%
如果您希望输出为 tab-separated 个字段,则:
awk -v FIELDWIDTHS="3 19 19 3 3 5 12 6 9 40 4 8 13 3 3 3 3 1 3 13 13 13 13 13 13 3 13 2 8 8 8 2 8 6 11 11 11 8 4" -v OFS="\t" "{key= OFS OFS OFS OFS OFS OFS OFS OFS } !seen[key]++{print key}" %inputpath%%file% > %inputpath%%file%%unique%
抱歉,我不知道 windows 语法,所以希望您知道如果我的引号有误或其他原因该怎么办。