Frage

Ich bin neu bei Grep und Awk - mit Windows 7 (ich habe Grep und awk für Windows von Gnuwin heruntergeladen).

Ich habe Probleme, dieses Skript auszuführen:

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

Ich bekomme den Fehler:

awk: '{print
awk: ^ Invalid char '' im Ausdruck

Ich glaube, es könnte etwas damit zu tun haben, Doppelzitate in Windows verwenden zu müssen, aber ich habe alle Kombinationen ausprobiert, die ich mir vorstellen kann, und es funktioniert immer noch nicht.

Kann jemand helfen? Vielen Dank

War es hilfreich?

Lösung

Es ist immer ein Schmerz an Fenstern. Als letztes Mittel könnten Sie wahrscheinlich verwenden gawk -f!

Also: Ihre Datei script.awk Enthält:

print $2,$1

Und du machst grep -Fwf dictionary.txt frequency.txt | awk -f script.awk

Andere Tipps

Unter Windows müssen Sie Doppelzitate verwenden, um Ihre awk -Befehle zu zitieren. So

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

muss geändert werden auf

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

Aber denken Sie daran, Sie können keine Doppelzitate innerhalb von Doppelzitaten verwenden, Sie müssen ihnen entkommen. Unter Windows können Sie nicht einfach verwenden \ es zu entkommen. Sie benötigen die folgende Syntax:

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

Richtig, das ist \"" zu repräsentieren " Innerhalb doppelter Zitate.

Sie müssen doppelte Zitate um Ihr awk -Skript verwenden und den eingebetteten Zitaten in der Druckanweisung mit einem guten alten Backslash entkommen: [g] awk "begin {print " hello Escape char! ""} "

Hier ist ein kurzes Beispiel, das eine Eingabe.CSV akzeptiert und dann ausgeben wird new.csv:

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

Da die Klammern in doppelten Zitaten liegen müssen, sind innerhalb des klammernden Ausdrucks drei Sätze von Doppelzitaten erforderlich.

Zum Beispiel:

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

Ich habe im Laufe der Jahre Stughuge, um Awk unter Windows zum Laufen zu bringen. Es gibt Probleme mit dem Zitieren und Pfadgrenzwerten. Meine endgültige Lösung ist es, "Awk fliegen zu lassen", das frei von der Befehlszeile ist. Ich verstehe, dass es als Klebstoff für Unix -Style -Befehlszeile Juju entwickelt wurde, aber ich wollte sie nur als Skriptsprache verwenden.

Alle meine awk -Skripte enthalten eine Liste von Zielen und eine definierte Ausgabedatei. Sie können durch Doppelklicken durch eine zugehörige DOS -Batch -Datei ausgeführt werden:

: 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

Ein Beispiel für meine awk -Skripte ist unten dargestellt (extrahieren Sie alle Zeilen mit :: tab und drucken Sie sie):

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

Sie können sehen, dass dies das Eingabeziel im Skript definiert und das endgültige Ausgabeziel im Skript definiert. Es wird eine Tempor -Datei ".out" verwendet, um viele Druckumleitung zu vermeiden und die Datei auf die gewünschte Ausgabe im Abschnitt End des Skripts zu kopieren.

Ich habe awk -Dateien mit dieser Stapeldatei zugeordnet und in meinem Editor eine Option hinzugefügt, um awk -Dateien an die Stapeldatei zu senden.

Mit freundlichen Grüße

Yousui sagte:

... Sie können keine Doppelzitate in Doppelzitaten verwenden, Sie müssen ihnen entkommen. Unter Windows können Sie nicht einfach verwenden, um ihm zu entkommen.

Zwar hat sich widerstrebendbiosguy in seinem Beispiel nur "verwendet.

Ich habe sowohl "" "" "" "" "" "") für)) und beide für mich gearbeitet (Gawk unter Windows XP sowohl in der Befehlszeile als auch in einer Stapeldatei).

Hier ist ein Beispiel, das "in der Ausgabe (ein String -Literal in C -Code) beteiligt ist:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top