gnuplot5-sh:1:语法错误:“0”;(“awk意外
我试图在gnuplot中结合使用paste和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
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/$$")
请注意1awk
命令如何通过管道向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中的语法错误。很抱歉,我从终端复制此处时出错。我编辑了消息。另请参阅