Pregunta

Soy nuevo en GREP y AWK: usando Windows 7 (descargué GREP y AWK para Windows de Gnuwin).

Tengo problemas para ejecutar este script:

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

Recibo el error:

Awk: '{imprimir
awk: ^ char '' 'en expresión

Creo que podría tener algo que ver con tener que usar citas dobles en Windows, pero probé todas las combinaciones en las que puedo pensar y aún así no funciona.

¿Alguien puede ayudar? Gracias

¿Fue útil?

Solución

Escapar de las líneas de la línea de comandos siempre es un dolor en las ventanas. Como último recurso, probablemente podrías usar gawk -f!

Entonces: tu archivo script.awk contiene:

print $2,$1

Y lo hace grep -Fwf dictionary.txt frequency.txt | awk -f script.awk

Otros consejos

En Windows, debe usar cotizaciones dobles para citar sus comandos AWK. Asi que

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

necesita ser cambiado a

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

Pero recuerde, no puede usar citas dobles dentro de citas dobles, debe escapar de ellas. En Windows no puedes usar simplemente \ para escapar. Necesita la siguiente sintaxis:

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

Bien, eso es \"" representar " Dentro de citas dobles.

Debe usar citas dobles en torno a su script AWK y escapar de las citas incrustadas en la declaración de impresión usando una buena barra invertida: [g] AWK "Begin {imprime " ¡Hola, char! "}"

Aquí hay un breve ejemplo que aceptará una entrada.csv, luego salida new.csv:

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

Dado que los soportes deben estar dentro de las cotizaciones dobles, se requieren tres conjuntos de citas dobles dentro de la expresión entre corchetes.

Por ejemplo:

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

Me puse de pie a lo largo de los años para que AWK funcione debajo de Windows. Hay problemas para citar y delimitadores de ruta. Mi solución final es "dejar que Awk vuele libre", que está libre de la línea de comando. Entiendo que se desarrolló como un pegamento para la línea de comandos de estilo Unix Juju, pero solo quería usarlo como un lenguaje de secuencias de comandos.

Todos mis scripts AWK contienen una lista de objetivos y un archivo de salida definido. Se pueden ejecutar haciendo doble clic a través de un archivo de lotes DOS asociado:

: 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

A continuación se presenta un ejemplo de mis scripts AWK (extraiga todas las líneas con :: pestaña e imprímalas):

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

Puede ver que esto define el objetivo de entrada dentro del script y define el objetivo de salida final dentro del script. Utiliza un archivo Temp ".out" para evitar mucha redirección de impresión, copiando el archivo a la salida deseada en la sección final del script.

He asociado archivos AWK con este archivo por lotes y agregué una opción en mi editor para enviar archivos AWK al archivo por lotes.

Saludos cordiales

Yousui dijo:

... No puede usar citas dobles dentro de citas dobles, debe escapar de ellas. En Windows no puede simplemente usar para escapar de él.

mientras que ReluctantBiosguy ha usado solo "en su ejemplo.

Probé tanto "" como ", y ambos funcionan para mí (boquiadas en Windows XP tanto en la línea de comandos como en un archivo por lotes).

Aquí hay un ejemplo que implica "en la salida (una cadena literal en el código 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top