Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从shell脚本执行awk脚本会产生语法错误_Awk_Nawk - Fatal编程技术网

从shell脚本执行awk脚本会产生语法错误

从shell脚本执行awk脚本会产生语法错误,awk,nawk,Awk,Nawk,目前,我有一个脚本,在其中我调用AWK喜欢 /usr/bin/nawk -f rst.awk file1 file2 而且rst.awk看起来像 cat rst.awk { split($2,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3] } NR==FNR { prev[$1] = curr; next } ($1 in prev) && (curr > prev[$1]) 在这种情况下,我需要确保每次运行脚本时都检查rst.

目前,我有一个脚本,在其中我调用AWK喜欢

/usr/bin/nawk -f rst.awk file1 file2
而且rst.awk看起来像

cat rst.awk
{ split($2,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3] }
NR==FNR { prev[$1] = curr; next }
($1 in prev) && (curr > prev[$1])
在这种情况下,我需要确保每次运行脚本时都检查rst.awk是否有上述内容

我们可以用脚本本身编写rst.awk内容吗? 我自己试过了,但运气不好

cat te.sh
/usr/bin/nawk -f
{ split($2,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3] }
NR==FNR { prev[$1] = curr; next }
($1 in prev) && (curr > prev[$1])
file1 file2



./te.sh
/usr/bin/nawk: no program filename
./te.sh: line 2: syntax error near unexpected token `$2,a,/\./'
./te.sh: line 2: `{ split($2,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3]}'

您需要te.sh包含以下内容之一:

#!/usr/bin/nawk -f
{ split($2,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3] }
NR==FNR { prev[$1] = curr; next }
($1 in prev) && (curr > prev[$1])

我强烈推荐后者。无论哪种方式,您都可以将其作为
te.sh file1 file2
执行


顺便说一句,“Awk需要帮助”是你可以选择的最糟糕的主题,与“恐龙闻起来很好笑”或类似的毫无用处的主题相比,它对未来寻找类似问题答案的人来说也没什么好处。选择捕获问题的主题行,例如“从shell脚本执行awk脚本会产生语法错误”。

您尝试了什么?因为我认为这应该行得通。更新帖子。不要使用评论。看起来你只是忘了引用你的awk脚本参数。你是什么意思,rst.awk的内容不能保证是不变的?(很容易使文件和目录不可写,因此“锁定”文件内容。)不欢迎,请考虑编辑您的问题,提供一个有用的,相关的主题线,所以人们在搜索档案的类似问题,有机会找到这个Q/A为独立的事情,我强烈的偏好是shebang,这样我就有更大的自由在脚本中使用我想要的任何引用。为什么强烈建议使用引用的脚本而不是shebang?如果人们习惯了这种方法,那么当他们尝试将awk集成到一个更大的shell脚本中时,问题可能会少一些。您经常需要将变量赋值与运行awk命令的文件分开,例如,让我们假设您想用awk:
awk-v s=3'BEGIN{print“s=”s}来编写此命令NR>=s'文件
。如果我们将shell脚本编写为
awk-v s=“$1”开始{print”s=“s}NR>=s'$2”
,那么您可以将shell脚本调用为
script.sh 3文件
。如果使用shebang,则无法执行此操作,因为无法将shell参数分隔为变量值和文件名。您可以调用
script.sh s=3文件
,但是BEGIN失败了,现在您正处于一个非常常见的需要设置变量的简单脚本的解决方案中。
/usr/bin/nawk '
{ split($2,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3] }
NR==FNR { prev[$1] = curr; next }
($1 in prev) && (curr > prev[$1])
' "$@"