Grep и Awk в Windows неверный символ в ошибке выражения - PullRequest
8 голосов
/ 31 января 2011

Я новичок в grep и awk - использую Windows 7 (я скачал grep и awk для windows из GnuWin).

У меня проблемы с запуском этого скрипта:

grep -Fwf dictionary.txt frequency.txt | awk '{print $2 "," $1}'

Я получаю ошибку:

awk: '{print
awk: ^ неверный символ '' 'в выражении

Я полагаю, что это может иметь какое-то отношение к использованию двойных кавычек в Windows, но я перепробовал все возможные комбинации, и все же это не работает.

Кто-нибудь может помочь? Спасибо

Ответы [ 7 ]

22 голосов
/ 28 ноября 2011

В Windows вам нужно использовать двойные кавычки для цитирования ваших команд awk. Итак

grep -Fwf dictionary.txt frequency.txt | awk '{print $2 "," $1}'

необходимо изменить на

grep -Fwf dictionary.txt frequency.txt | awk "{print $2 "," $1}"

Но помните, вы не можете использовать двойные кавычки внутри двойных кавычек, вам нужно избегать их. В Windows вы не можете просто использовать \ , чтобы избежать этого. Вам нужен следующий синтаксис:

grep -Fwf dictionary.txt frequency.txt | awk "{print $2 \"",\"" $1}"

Да, это \ "" для представления " в двойных кавычках.

5 голосов
/ 31 января 2011

Выход из командной строки - это всегда боль в Windows. В крайнем случае вы можете использовать gawk -f!

Итак: ваш файл script.awk содержит:

print $2,$1

А вы делаете grep -Fwf dictionary.txt frequency.txt | awk -f script.awk

4 голосов
/ 17 марта 2011

Вам необходимо использовать двойные кавычки вокруг вашего сценария awk и экранировать встроенные кавычки в операторе печати, используя старый добрый обратный слеш: [g] awk "BEGIN {print \" Hello escape char! \ "}"

1 голос
/ 11 октября 2013

Поскольку скобки должны быть в двойных кавычках, в выражении в скобках требуется три набора двойных кавычек.

Например:

gawk "{print $2 """,""" $1}"

1 голос
/ 20 июля 2013

Вот краткий пример, который примет input.csv, а затем выведет new.csv:

gawk < input.csv -F, "{print $1 \"",\"" $5} ">new.csv
0 голосов
/ 19 февраля 2014

Юсуи сказал:

... вы не можете использовать двойные кавычки внутри двойных кавычек, вам нужно их избежать.В Windows вы не можете просто использовать \, чтобы избежать его.

, в то время как ReluctantBIOSGuy использовал просто \ "в своем примере.

Я пробовал оба \" "и \",у меня оба работают (gawk под Windows XP как в командной строке, так и в командном файле).

Вот пример использования "в выводе (строковый литерал в коде c):

FCIV\fciv -add ..\07-Sources -type *.h -type *.c -bp ..\07-Sources | find /V "//" | sort /+33 > listof.md5
FCIV\fciv -add listof.md5 | find /V "//" | gawk "{print \"static const char md5[] = \\\"\" $1 \"\\\";\"}" > ..\07-Sources\generated\md5.c
0 голосов
/ 13 июня 2013

Я изо всех сил пытался запустить AWK под Windows. Есть проблемы с цитированием и разделителями пути. Мое окончательное решение состоит в том, чтобы «позволить AWK лететь свободно», то есть свободно от командной строки. Я понимаю, что он был разработан как клей для командной строки в стиле Unix juju, но я просто хотел использовать его как язык сценариев.

Все мои сценарии AWK содержат список целей и определенный выходной файл. Их можно запустить, дважды щелкнув по соответствующему пакетному файлу DOS:

: AWK.BAT - place in the same directory as GAWK
@echo off

:Check %1 in not null
If [%1]==[] (
    cls
    Echo No parameters passed
    goto End
)

: Change to the parameter file location
cd /D "%~dp1"

: Set PrintFile - this will be the name of the script (not the target file) with ".out"
Set PrintFile=%~nx1.out

:Run AWK
:   -v PrintFile to allow renaming of output file
:   -f ScriptFile.awk the program
:   > Redirects output to a known destination
cls
P:\MyPrograms\EDITORS\Addins\gawk\gawk.exe  -v PrintFile=%PrintFile% -f %* >%PrintFile%

:End
pause

Пример моих сценариев AWK представлен ниже (извлеките все строки с помощью :: tab и напечатайте их):

# AWK Template

BEGIN{
    ## Hard Code Target Files - Unix paths with / separators ##
    #   Realtive paths from the location of ScriptFileName.awk
    #   These will be added to the end of the ARG array - after any command line target files
    AddTarget("../APEdit.ahk")

    ## Hard Code Output Files - WinDos paths with \\ separators ##
    #   Realtive paths from the location of ScriptFileName.awk
    #   Default is ScriptFileName.awk.out passed in as a variable called PrintFile
    #   PrintFile will be copied to OutputFile after processing using the END section
    OutputFile = "Keys.txt"

    # Set input record sep and field sep
    RS="\n"
    FS=" "

    # Set output RS and FS
    ORS="\n"
    OFS=" " 

    # Write a header
    print "Key assignments from the source code"
    print " "
}

## MIDDLE - Once per matching record! ## 

# Find autohotkey key definitions
/::\t/ { 
    print $0
}

END{

    ## Rename output files
    if (OutputFile) {
        system("Copy /Y " PrintFile "  " OutputFile)
    }
}

## Functions ##
function AddTarget(FN){
    # Need to check file exists
    if (FileExists(FN)){
        ARGV[ARGC] = FN
        ARGC ++
    }
}

function FileExists(FN) {
    if ((getline < FN) > 0) {
        close(FN);
        return 1
    } else {
        print "Target file not found " FN > "error.awk.txt"
        return ""
    }
}

Вы можете видеть, что это определяет цель ввода в сценарии и определяет конечную цель вывода в сценарии. Он использует временный файл «.out», чтобы избежать большого перенаправления печати, копируя файл в нужный вывод в разделе END скрипта.

Я связал файлы AWK с этим пакетным файлом и добавил опцию в моем редакторе для отправки файлов AWK в пакетный файл.

С уважением

...