在gnuplot中将shell变量传递给awk

3

我需要将一个shell变量传递给awk,但在gnuplot中我收到了错误信息: 该变量在脚本中设置,名为FILE。这个变量根据日期而改变。 我的代码:(在Gnuplot脚本中)

plot FILE using 1:14 with points pointtype 7 pointsize 1 # this works fine

replot '< awk ''{y1 = y2; y2 = $14; if (NR > 1 && y2 - y1 >= 100) printf("\n") ; if (NR > 1 && y2 -y1 <= -100) printf("\n"); print}'' FILE' using 1:14 with linespoints 
Err msg
awk: fatal: cannot open file `FILE' for reading (No such file or directory)

当我硬编码文件路径时,重新绘制工作正常。

有人能澄清一下我需要传递这个变量给awk的代码吗?我是否正确地想到了像这样的东西:

% environment_variable=FILE
% awk -vawk_variable="${environment_variable}" 'BEGIN { print awk_variable }' ?

这是我的Gnuplot脚本代码:主要是从其他帖子中拼凑而成的。
#FILE selection - we want to plot the most recent data file

FILE = strftime('/data/%Y-%m-%d.txt', time(0))  # this is correct

print "FILE is : " .FILE

#set file path variable for awk :      (This is where my problem is)

awk -v var="$FILE" '{print var}'

awk '{print $0}' <<< "$FILE"

感谢您的预先帮助。

在你的第一个脚本中,使用"$FILE"代替FILE。在你的第二个脚本中,最后一行不需要使用<<<awk -v var="$FILE" '{print var}'是不完整的语法,它需要一个文件作为参数,否则会使你的计算机停止响应。只需使用awk '{print $0}' "$FILE"即可。 - Aserre
@Ploutox 他需要使用<<<,这会将变量中的数据传递到awk - Jotne
@Jotne 哦,我以为 FILE 只保存文件的路径,而不是其整个内容。如果是这样的话,那么你确实是正确的。编辑:经过进一步阅读,似乎 OP 只是将最新文件的路径存储在 $FILE 中。然后他应该删除 <<<(否则他的 awk 命令只会打印路径)。 - Aserre
@Ploutox - 你是正确的 - 只有文件路径存储在$FILE中;而不是实际内容 - 这些内容由Gnuplot解析。 - user3778424
当我在我的gnuplot脚本中使用:awk '{print $0}' "$FILE"时,我会收到一个错误消息:无效命令。 - user3778424
1个回答

2
如果FILE是包含文件路径的gnuplot变量,则可以执行以下操作:
FILE = 'input'
plot '<awk ''1'' ' . FILE

这将 gnuplot 变量 FILE 的值连接到 awk 命令的末尾。因此得到的 awk "脚本" 是 awk '1' input(只打印文件的每一行);您可以用任何您想在 awk 中做的操作来替换 '1'
顺便说一下,您的 awk 脚本可以简化为以下内容:
awk '{ y1 = y2; y2 = $14 } NR > 1 && (y2 - y1 >= 100 || y2 - y1 <= -100) { print "" } { print $1, $14 }'

很少需要在awk中使用if,因为每个块{ }都是有条件执行的(如果没有指定条件,则该块始终被执行)。假设您没有修改记录分隔符(RS变量),print ""printf("\n")相同。在gnuplot中,您可以只打印您感兴趣的列,而不是指定using 1:14,方法是使用print $1, $14
因此,在gnuplot中,您的replot行将是:
replot '<awk ''{ y1 = y2; y2 = $14 } NR > 1 && (y2 - y1 >= 100 || y2 - y1 <= -100) { print "" } { print $1, $14 }'' ' . FILE with linespoints

当然,这一行有点长。你可能需要把它分开一些:

awk_cmd = '{ y1 = y2; y2 = $14 } NR > 1 && (y2 - y1 >= 100 || y2 - y1 <= -100) { print "" } { print $1, $14 }'
replot sprintf("<awk '%s' %s", awk_cmd, FILE) with linespoints

仍在苦苦挣扎。我在我的gnuplot脚本中设置了FILE = strftime('/data/%Y-%m-%d.txt', time(0))...为了将这个变量FILE传递给awk,我正在尝试使用以下命令:`awk -v 'var=FILE '{print var}'' .....我的语法正确吗?AWk固执地拒绝读取并使用该变量...再次感谢任何帮助.. - user3778424
你想让awk处理存储在gnuplot变量FILE中的文件吗?如果是这样,我的回答会告诉你如何做到这一点。如果不是,请明确你想要做什么?为什么你想让awk脚本打印出gnuplot变量的值?请更新你的问题以澄清。顺便说一句,你还没有接受我的上一个问题的答案。如果你能接受它,我会很感激。 - Tom Fenech
嗨Tom - 是的,你的初始答案似乎是正确的,但我不能让代码在我的脚本中起作用。我使用awk是因为我需要进行条件绘图,即一些数据点必须连接,而其他数据点则根据它们的值而不连接。这是代码和错误信息:gnuplot> plot '< awk ''{y1 = y2; y2 = $12; if (NR > 1 && y2 - y1 >= 100) printf("\n") ; if (NR > 1 && y2 -y1 <= -100) printf("\n"); print}'. FILE using 1:12 with linespoints sh:-c:第0行:查找匹配''sh时遇到意外的EOF:-c:第1行:语法错误:意外的文件结束警告:跳过没有有效点的数据文件。 - user3778424
你没有以''结束awk命令。将print}' .FILE更改为print}'' '.FILE。或者更好的方法是使用我的答案中的代码,但将$14更改为$12 - Tom Fenech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接