如何使用 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 语法,所以希望您知道如果我的引号有误或其他原因该怎么办。