我是grep和awk的新手 - 使用Windows 7(我从GnuWin下载了grep和awk for windows)。
我无法运行此脚本:
grep -Fwf dictionary.txt frequency.txt | awk '{print $2 "," $1}'
我收到错误:
awk:'{print
awk:^表达式中的char'''无效
我认为它可能与在Windows中使用双引号有关,但我尝试了所有我能想到的组合,但它仍然不起作用。
有人可以帮忙吗? 感谢
答案 0 :(得分:22)
在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}"
是的, \“” 在双引号内代表“。
答案 1 :(得分:5)
在Windows上转义命令行项目总是很麻烦。作为最后的手段,您可以使用gawk -f
!
所以:您的文件script.awk
包含:
print $2,$1
你做grep -Fwf dictionary.txt frequency.txt | awk -f script.awk
答案 2 :(得分:4)
你需要在awk脚本周围使用双引号,并使用一个好的旧反斜杠转义print语句中的嵌入式引号:[g] awk“BEGIN {print \”Hello escape char!\“}”
答案 3 :(得分:1)
这是一个简短的例子,它将接受input.csv,然后输出new.csv
:
gawk < input.csv -F, "{print $1 \"",\"" $5} ">new.csv
答案 4 :(得分:1)
由于括号必须在双引号内,因此在括号内的表达式中需要三组双引号。
例如:
gawk "{print $2 """,""" $1}"
答案 5 :(得分: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文件发送到批处理文件。
亲切的问候
答案 6 :(得分: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