У меня есть командная строка awk, разработанная в Unix, и я должен передать ее в Windows. Я установил инструмент gawk для Windows, настроил переменную среды и, наконец, преобразовал оболочку в пакетную, но когда я запускаю .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[$1,$2,$6,$8,$9,$12,$16,$17,$33]++}" 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[$1,$2,$6,$8,$9,$12,$16,$17,$33]++}
к:
!x[$1,$2,$6,$8,$9,$12,$16,$17,$33]++
поэтому результат рассматривается как условие, которое может вызвать действие по умолчанию 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[$1,$2,$6,$8,$9,$12,$16,$17,$33]++" %inputpath%%file% > %inputpath%%file%%unique%
Если вы хотите, чтобы на выходе были поля, разделенные табуляцией, то:
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=$1 OFS $2 OFS $6 OFS $8 OFS $9 OFS $12 OFS $16 OFS $17 OFS $33} !seen[key]++{print key}" %inputpath%%file% > %inputpath%%file%%unique%
Извините, я не знаю синтаксиса Windows, поэтому, надеюсь, вы знаете, что с этим делать, если я неправильно понял кавычки или что-то в этом роде.