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))
我正在尝试将 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))