gnuplot5 - sh:1:语法错误:“(”awk意外

时间:2017-04-06 13:17:18

标签: awk gnuplot paste

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

sh: 1: Syntax error: "(" unexpected

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

system("paste <(awk '{print $1,$2,$3,$4,$5,$14}' ".filename(i).") <(awk '{print $14}' ".filename_without.")  > Tim_res_".i)

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

我已经读过添加#!/usr/bin/bash可能有所帮助,但它实际上并没有解决问题,也没有给出另一个错误消息。我之前从未在gnuplot中使用过这样的命令。 我有很多文件以类似的方式绘制,因此为什么我想直接在gnuplot中使用它,system命令只是为了确保它在我可以直接替换它之后才能使用{gnuplot的plot命令。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

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

sh ,只能假定具有POSIX强制功能,不支持process substitutions (<(...)) ,这是非标准的Bash特征

Tom Fenech's helpful answer显示了你的命令的重新制定,完全绕过了过程替换的需要。

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

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

  • (b)或:使用临时文件而不是进程替换;在您的情况下,创建至少一个包含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提供输入,但另一个命令需要临时文件。

答案 1 :(得分:1)

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

awk 'NR == FNR { col[NR] = $14; next } { print $1,$2,$3,$4,$5,$14,col[FNR] }' file2 file1

即,首先读取第二个文件并保存列,然后执行&#34;粘贴&#34;你自己在awk。

将awk命令移动到gnuplot:

system("awk 'NR == FNR { col[NR] = $14; next } \
{ print $1,$2,$3,$4,$5,$14,col[FNR] }' " . filename_without . " " . filename(i))