Вопрос

Я новичок в GREP и AWK - используя Windows 7 (я скачал GREP и AWK для Windows от Gnuwin).

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

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

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

awk: '{print
awk: ^ недействительный char '' в выражении

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

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

Это было полезно?

Решение

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

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

print $2,$1

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

Другие советы

В Windows вам нужно использовать двойные кавычки, чтобы цитировать ваши команды AWK. Так

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

нужно изменить на

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

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

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

Верно, это \"" представлять " Внутри двойные цитаты.

Вам нужно использовать двойные цитаты вокруг своего сценария AWK и избежать встроенных цитат в заявлении печати, используя старую старую обратную черту: [g] awk "begin {print " hello Escape char! "}"

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

gawk < input.csv -F, "{print $1 \"",\"" $5} ">new.csv

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

Например:

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

За эти годы я вступил в борьбу, работая под Windows. Есть проблемы с цитированием и делимитерами пути. Мое окончательное решение - «Пусть Awk Flee Free», который свободен от командной строки. Я понимаю, что он был разработан как клей для командной строки Unix Style 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 и print his):

# 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 ""
    }
}

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

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

С уважением

Юсуи сказал:

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

В то время как неохотный биосгуй использовал только »в своем примере.

Я попробовал обоих "" и ", и оба работают для меня (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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top