gnuplot5 - sh: 1: Syntax error: "(" unexpected with awk

gnuplot5 - sh: 1: Syntax error: "(" unexpected with awk

我正在尝试将 paste 与 gnuplot 中的 awk 结合使用,以便我可以获取两个不同文件的某些列并绘制结果。但是,我收到此错误:

sh: 1: Syntax error: "(" unexpected

我知道它对我的 gnuplot 脚本的那部分不满意:

system("paste <(awk '{print ,,,,,}' ".filename(i).") <(awk '{print }' ".filename_without.")  > Tim_res_".i)

更具体地说是 awk 之前的括号。在不使用变量名的情况下替换文件名也不起作用,而所有命令在 gnuplot 之外都可以正常工作。如果我删除括号,那么它会说它无法识别 awk,并且该命令在 gnuplot 之外也不起作用。

我读到添加 #!/usr/bin/bash 可能会有所帮助,但它实际上并没有解决问题,也没有给出其他错误消息。我以前从未在 gnuplot 中使用此类命令遇到过此类问题。 我有很多文件要以类似的方式绘制,因此为什么我想直接在 gnuplot 中使其自动生成,system 命令只是在这里确保它在我可以直接替换它之前工作plot gnuplot 命令。

感谢您的帮助

如错误消息所示,您的命令是使用 sh (/bin/sh) 执行的,这就是 gnuplot 的 system 命令所使用的。

sh,只能假设有POSIX强制的特性,不支持process substitutions (<(...)),这是一个非标准的 Bash 特征。

显示了您的命令的重新表述,完全绕过了进程替换的需要。

如果您确实需要(相当于)流程替换

  • (a) 要么:调用 bash -c 作为 system() 命令字符串的一部分,将原始命令传递给它(这会带来引用挑战)。

  • (b) 或者:使用临时文件代替进程替换;在您的情况下,创建至少 1 个包含 awk 输出的临时文件,然后将其传递给 paste.

简化示例:

(a) 使用嵌入式 bash -c 调用:

system("bash -c \"paste <(cat '".filename1."') <(cat '".filename2."')\"")

注意内部命令是如何包含在 \" 中的,因此它可以作为单个参数传递给 bash -c

(b) 使用临时文件:

system("cat '".filename1."'>>/tmp/$$; cat '".filename2."' | paste /tmp/$$ -; rm /tmp/$$")

请注意 1 awk 命令如何通过管道向 paste 提供输入,但另一个需要一个临时文件。

问题是什么 - 解决方法是完全避免进程替换:

awk 'NR == FNR { col[NR] = ; next } { print ,,,,,,col[FNR] }' file2 file1

也就是说,先读取第二个文件并保存该列,然后在 awk 中自己执行 "paste"。

将 awk 命令移动到 gnuplot:

system("awk 'NR == FNR { col[NR] = ; next } \
{ print ,,,,,,col[FNR] }' " . filename_without . " " . filename(i))