我正在尝试使用粘贴与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
命令。
感谢您的帮助
答案 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))