windows - para - gawk cmd
Grep y Awk en Windows Char no válido en error de expresión (7)
Escapar elementos de línea de comandos siempre es un problema en Windows. Como último recurso, probablemente puedas usar gawk -f
!
Entonces, su archivo script.awk
contiene:
print $2,$1
Y haces grep -Fwf dictionary.txt frequency.txt | awk -f script.awk
grep -Fwf dictionary.txt frequency.txt | awk -f script.awk
Soy nuevo en grep y awk, con 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}''
Me sale el error:
awk: ''{print
awk: ^ inválido char '''' ''en expresión
Creo que podría tener algo que ver con tener que usar comillas dobles en Windows, pero probé todas las combinaciones que puedo pensar y todavía no funciona.
¿Alguien puede ayudar? Gracias
Necesita usar comillas dobles alrededor de su secuencia de comandos awk y escapar de las comillas incrustadas en la instrucción de impresión con una buena barra diagonal anterior: [g] awk "BEGIN {print /" Hello escape char! / "}"
En Windows, necesita utilizar comillas 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 recuerda, no puedes usar comillas dobles dentro de comillas dobles, necesitas escapar de ellas. En Windows, no puedes usar simplemente / para escapar de él. Necesita la siguiente sintaxis:
grep -Fwf dictionary.txt frequency.txt | awk "{print $2 /"",/"" $1}"
Correcto, eso es / "" para representar " dentro de comillas dobles.
He luchado durante años para que AWK funcione bajo Windows. Hay problemas con los delimitadores de citas y rutas. Mi solución final es "dejar que AWK vuele gratis", que está libre de la línea de comandos. Entiendo que fue desarrollado como un pegamento para la línea de comandos estilo juix de Unix, pero solo quería usarlo como lenguaje de scripting.
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 lote de 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
Un ejemplo de mis scripts AWK se presenta a continuación (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 de la secuencia de comandos y define el objetivo de salida final dentro de la secuencia de comandos. Utiliza un archivo temporal ".out" para evitar una gran cantidad de redirección de impresión, copiando el archivo al resultado deseado en la sección END del script.
He asociado archivos AWK con este archivo por lotes y he agregado una opción en mi editor para enviar archivos AWK al archivo por lotes.
Saludos cordiales
Aquí hay un breve ejemplo que aceptará un input.csv, luego new.csv
:
gawk < input.csv -F, "{print $1 /"",/"" $5} ">new.csv
Dado que los corchetes deben estar entre comillas dobles, se requieren tres conjuntos de comillas dobles dentro de la expresión entre corchetes.
Por ejemplo:
gawk "{print $2 """,""" $1}"
Yousui dijo:
... no puedes usar comillas dobles dentro de comillas dobles, necesitas escapar de ellas. En Windows, no puedes usar simplemente / para escapar de él.
mientras que ReluctantBIOSGuy solo ha usado / "en su ejemplo.
Intenté ambos / "" y / ", y ambos funcionan para mí (mirar debajo de Windows XP tanto en la línea de comando como en un archivo por lotes).
Aquí hay un ejemplo que implica "en el resultado (un literal de cadena en 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