14

我是 grep 和 awk 的新手 - 使用 Windows 7(我从 GnuWin 下载了 grep 和 awk for windows)。

我在运行此脚本时遇到问题:

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

我得到错误:

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

我相信这可能与在 Windows 中必须使用双引号有关,但我尝试了所有我能想到的组合,但仍然不起作用。

任何人都可以帮忙吗?谢谢

4

7 回答 7

26

在 Windows 上,您需要使用双引号来引用您的 awk 命令。所以

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

需要改为

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

但请记住,您不能在双引号内使用双引号,您需要对它们进行转义。在 Windows 上,您不能简单地使用\它来转义它。您需要以下语法:

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

对,就是\""来表示"双引号内。

于 2011-11-28T08:54:56.527 回答
6

转义命令行项目在 Windows 上总是很痛苦。作为最后的手段,你可能会使用gawk -f

所以:您的文件script.awk包含:

print $2,$1

你也是grep -Fwf dictionary.txt frequency.txt | awk -f script.awk

于 2011-01-31T15:06:10.833 回答
4

您需要在 awk 脚本周围使用双引号,并使用旧的反斜杠转义 print 语句中的嵌入引号: [g]awk "BEGIN {print \"Hello escape char!\"}"

于 2011-03-17T13:34:08.497 回答
1

这是一个简短的示例,它将接受 input.csv ,然后输出new.csv

gawk < input.csv -F, "{print $1 \"",\"" $5} ">new.csv
于 2013-07-19T21:57:15.013 回答
1

由于括号必须在双引号内,因此括号内的表达式需要三组双引号。

例如:

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

于 2013-10-11T17:48:00.783 回答
0

多年来,我一直在努力让 AWK 在 Windows 下运行。引用和路径分隔符存在问题。我的最终解决方案是“让 AWK 自由飞行”,即从命令行中解放出来。我知道它是作为 unix 风格命令行 juju 的粘合剂而开发的,但我只是想将它用作脚本语言。

我所有的 AWK 脚本都包含一个目标列表和一个定义的输出文件。它们可以通过双击关联的 DOS 批处理文件来运行:

: 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

下面给出了我的 AWK 脚本的一个示例(使用 ::tab 提取所有行并打印它们):

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

您可以看到这定义了脚本中的输入目标并定义了脚本中的最终输出目标。它使用临时“.out”文件来避免大量打印重定向,将文件复制到脚本 END 部分中的所需输出。

我已将 AWK 文件与此批处理文件相关联,并在我的编辑器中添加了一个选项以将 AWK 文件发送到批处理文件。

亲切的问候

于 2013-06-13T16:05:57.243 回答
0

优穗 说道:

...您不能在双引号内使用双引号,您需要转义它们。在 Windows 上,您不能简单地使用 \ 来转义它。

而 ReluctantBIOSGuy 在他的示例中只使用了 \" 。

我尝试了 \"" 和 \",两者都适用于我(在 Windows XP 下的命令行和批处理文件中都使用 gawk)。

这是一个在输出中涉及 " 的示例(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
于 2014-02-19T17:23:16.473 回答