2014-11-08 580 views
2

我试图从网格中的节点读取x和y坐标。所有节点的坐标位于文件mesh_coords.xyz中。我想要一个提到1055行的词,它是指一个叫做哈利斯科的地方。awk:fatal:无法打开文件`'进行读取(无此文件或目录)

nodes_file='../output/ascii/mesh_coords.xyz' 

jalisco=`awk '{if (NR==1055) print $0}' ${nodes_file}` 

x=`awk '{print $1}' ${jalisco}` 
y=`awk '{print $2}' ${jalisco}` 

返回: “AWK:CMD行:1:致命的:无法打开文件'4250.000000' 读取(没有这样的文件或目录)” 两次(我假设一次x和一次Y)。

但是:

nodes_file='../output/ascii/mesh_coords.xyz' 

awk '{if (NR==1055) print $0}' ${nodes_file} 

打印正确的X和Y坐标。 我需要稍后使用变量x和y,以便它们需要正确设置。

我对Linux比较陌生,所以很抱歉,如果这是一个简单的awk/shell语法问题。

+2

使用'$()'而不是反引号。 – 2014-11-08 11:29:39

+0

它看起来像'$ jalisco'包含执行前一个awk命令(这是一个数字)的结果。然后,您尝试将其用作文件名,但不存在。 – 2014-11-08 11:32:14

+2

'awk'{if(NR == 1055)print $ 0}''可以更简洁地写成'awk NR == 1055' – 2014-11-08 11:49:29

回答

6

我相信$jalisco变量保持x-y坐标由一个字符串中的空格分隔。显然$jalisco不是一个文件,因此你的最后2个awk命令给出错误。

您可以使用此:

read x y < <(awk 'NR==1055' "$nodes_file") 

另外请注意,您的awk命令可以被缩短:

x=$(awk '{print $1}' <<< "${jalisco}") 
y=$(awk '{print $2}' <<< "${jalisco}") 

或者更好的是,使用进程替换你的第一个AWK本身获得这两个值到:

awk 'NR==1055' "$nodes_file" 

默认的操作是打印行,所以这是awk在条件NR==1055为true时会执行的操作。

+1

感谢问题解决! – co323 2014-11-08 13:23:51

+0

不客气,很高兴帮助。 – anubhava 2014-11-08 13:25:20

相关问题