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

gnuplot5-sh:1:语法错误:“0”;(“awk意外,awk,gnuplot,paste,Awk,Gnuplot,Paste,我试图在gnuplot中结合使用paste和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_r

我试图在gnuplot中结合使用paste和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)

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

sh
,只能假设其具有POSIX强制功能,不支持属于非标准Bash功能的

显示了对命令的重新格式化,完全不需要进行进程替换

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

system("bash -c \"paste <(cat '".filename1."') <(cat '".filename2."')\"")
system("cat '".filename1."'>>/tmp/$$; cat '".filename2."' | paste /tmp/$$ -; rm /tmp/$$")
  • (a) 或者:调用
    bash-c
    ,作为
    system()
    命令字符串的一部分,将原始命令传递给它(这会带来引用挑战)

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

简化示例: (a)使用嵌入式
bash-c
调用

system("bash -c \"paste <(cat '".filename1."') <(cat '".filename2."')\"")
system("cat '".filename1."'>>/tmp/$$; cat '".filename2."' | paste /tmp/$$ -; rm /tmp/$$")
请注意1
awk
命令如何通过管道向
paste
提供输入,但另一个命令需要一个临时文件。

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

awk 'NR == FNR { col[NR] = $14; next } { print $1,$2,$3,$4,$5,$14,col[FNR] }' file2 file1
也就是说,首先读取第二个文件并保存该列,然后自己在awk中进行“粘贴”

将awk命令移动到gnuplot:

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

<(
两个字符之间有空格也是shell中的语法错误。很抱歉,我从终端复制此处时出错。我编辑了消息。另请参阅