Domanda

Sono nuovo in Grep e Awk - usando Windows 7 (ho scaricato Grep e Awk per Windows da Gnuwin).

Ho difficoltà a eseguire questo script:

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

Ricevo l'errore:

awk: '{print
awk: ^ invalid char '' 'in espressione

Credo che potrebbe avere qualcosa a che fare con il dover usare doppie citazioni in Windows, ma ho provato tutte le combinazioni a cui riesco a pensare e ancora non funziona.

Qualcuno può aiutare? Grazie

È stato utile?

Soluzione

La fuga degli elementi della riga di comando è sempre un dolore alle finestre. Come ultima risorsa potresti probabilmente usare gawk -f!

Quindi: il tuo file script.awk contiene:

print $2,$1

E tu fai grep -Fwf dictionary.txt frequency.txt | awk -f script.awk

Altri suggerimenti

Su Windows, devi usare doppi citazioni per citare i tuoi comandi AWK. Così

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

deve essere cambiato in

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

Ma ricorda, non puoi usare doppie citazioni all'interno di doppie citazioni, devi sfuggire a loro. Su Windows non puoi semplicemente usare \ per sfuggire. Hai bisogno della seguente sintassi:

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

Giusto, questo è \"" rappresentare " all'interno delle doppie citazioni.

Devi usare doppie citazioni attorno al tuo sceneggiatura awk e sfuggire alle citazioni incorporate nell'istruzione di stampa usando una buona vecchia retroscena: [g] awk "inizi {print " hello esca char! "}"

Ecco un breve esempio che accetterà un input.csv, quindi output new.csv:

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

Poiché le staffe devono essere in doppie citazioni, sono richiesti tre serie di doppie citazioni all'interno dell'espressione della staffa.

Per esempio:

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

Nel corso degli anni mi sono imbattuto per mettermi in giro sotto Windows. Ci sono problemi con le citazioni e i delimitatori del percorso. La mia soluzione finale è "lasciare che Awk vola libero", che è libero dalla riga di comando. Capisco che è stato sviluppato come colla per la linea di comando in stile unix Juju, ma volevo solo usarlo come linguaggio di scripting.

Tutti i miei script Awk contengono un elenco di target e un file di output definito. Possono essere eseguiti facendo doppio clic tramite un file batch DOS associato:

: 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

Di seguito viene presentato un esempio dei miei script Awk (estrarre tutte le righe con :: Tab e stampali):

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

È possibile vedere che questo definisce l'obiettivo di input all'interno dello script e definisce il target di output finale all'interno dello script. Utilizza un file temp ".out" per evitare un sacco di reindirizzamento di stampa, copiando il file nell'output desiderato nella sezione finale dello script.

Ho associato file AWK con questo file batch e ho aggiunto un'opzione nel mio editor per inviare file AWK al file batch.

Cordiali saluti

Yousui ha detto:

... Non puoi usare doppie citazioni all'interno di doppie citazioni, devi sfuggire a loro. Su Windows non puoi semplicemente usare per sfuggire.

Mentre il riluttantebiosguy ha usato solo "nel suo esempio.

Ho provato entrambi "" e ", ed entrambi funzionano per me (Gawk sotto Windows XP sia sulla riga di comando che in un file batch).

Ecco un esempio che coinvolge "nell'output (una stringa letterale in codice 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top