Question

Je suis nouveau à grep et awk - en utilisant Windows 7 (j'ai téléchargé grep et awk pour les fenêtres de GNUWin)

.

J'ai du mal à lancer ce script:

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

J'obtiens l'erreur:

awk: « {print
awk: ^ invalide char '' » dans l'expression

Je crois qu'il pourrait avoir quelque chose à voir avec le fait d'utiliser des guillemets doubles dans Windows, mais j'ai essayé toutes les combinaisons que je peux penser et encore il ne fonctionne pas.

Quelqu'un peut-il aider? Merci

Était-ce utile?

La solution

Échapper éléments de ligne de commande est toujours une douleur sous Windows. En dernier recours, vous pouvez probablement utiliser gawk -f!

: votre script.awk fichier contient:

print $2,$1

Et vous grep -Fwf dictionary.txt frequency.txt | awk -f script.awk

Autres conseils

Sous Windows, vous devez utiliser les guillemets doubles pour vos commandes awk. Donc,

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

doit être modifié à

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

Mais rappelez-vous, vous ne pouvez pas utiliser des guillemets doubles à l'intérieur des guillemets doubles, vous devez les échapper. Sous Windows, vous ne pouvez pas utiliser simplement \ pour y échapper. Vous avez besoin de la syntaxe suivante:

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

Droit, c'est \ "" pour représenter " à l'intérieur des guillemets doubles.

Vous devez utiliser des guillemets autour de votre script awk et échapper aux citations incorporées dans la déclaration d'impression à l'aide d'un bon vieux anti-slash: [g] awk « begin {print \ »

Bonjour échapper ombles \! « } »

Voici un court exemple qui acceptera un input.csv, puis new.csv de sortie:

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

Puisque les crochets doivent être entre guillemets, trois ensembles de guillemets doubles sont nécessaires dans l'expression entre crochets.

Par exemple:

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

J'ai stuggled au fil des ans pour obtenir AWK sous Windows. Il y a des problèmes avec les guillemets et délimiteurs de chemin. Ma solution finale consiste à « laisser AWK vol libre », qui est libre de la ligne de commande. Je comprends qu'il a été développé comme une colle pour la ligne de commande de style unix juju, mais je voulais juste l'utiliser comme un langage de script.

Tous mes scripts awk contiennent une liste de cibles et un fichier de sortie défini. Ils peuvent être exécutés en double-cliquant dans un fichier batch DOS associé:

: 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 exemple de mes scripts awk est présenté ci-dessous (extrait toutes les lignes avec :: onglet et les imprimer):

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

Vous pouvez voir ce qui définit la cible d'entrée dans le script et définit la cible de sortie finale dans le script. Il utilise une température « .out » fichier lots de redirection Évitez d'impression, la copie du fichier sur la sortie souhaitée dans la section FIN du script.

Je l'ai associé des fichiers AWK avec ce fichier batch et a ajouté une option dans mon éditeur pour envoyer des fichiers AWK au fichier batch.

Cordialement

Yousui dit:

... vous ne pouvez pas utiliser des guillemets doubles à l'intérieur des guillemets doubles, vous devez les échapper. Sous Windows, vous ne pouvez pas utiliser simplement \ pour y échapper.

alors que ReluctantBIOSGuy a utilisé juste \ » dans son exemple.

J'ai essayé à la fois \ « » et \ », et les deux œuvres pour moi (gawk sous Windows XP à la fois sur la ligne de commande et dans un fichier batch).

Voici un exemple impliquant "dans la sortie (un littéral de chaîne dans le code 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top