【问题标题】:awk: fatal: cannot open file `' for reading (No such file or directory)awk:致命:无法打开文件''进行读取(没有这样的文件或目录)
【发布时间】:2014-11-08 11:27:11
【问题描述】:

我正在尝试从网格中的节点读取 x 和 y 坐标。所有节点的坐标都在文件mesh_coords.xyz 中。我想要引用第 1055 行的那个,它指的是一个叫哈利斯科的地方。

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.line:1: fatal: cannot open file `4250.000000' for reading(没有这样的文件或目录)”两次(我假设 x 一次,y 一次)。

但是:

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

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

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

我对 Linux 比较陌生,如果这是一个简单的 awk/shell 语法问题,我深表歉意。

【问题讨论】:

  • 使用 $() 而不是反引号。
  • 貌似$jalisco包含了前面awk命令的执行结果,是一个数字。然后,您尝试将其用作不存在的文件名。
  • awk '{if (NR==1055) print $0}'可以写得更简洁awk NR==1055
  • 在有效的示例中,您查看的是nodes_file,而不是jalisco。
  • 你的方法很可能是错误的,因为你是从 shell 一步一步调用 awk,而正确的方法几乎可以肯定是在一个 awk 命令中完成整个工作。

标签: linux bash shell awk


【解决方案1】:

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

你可以用这个:

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

或者更好的是,使用进程替换从您的第一个 awk 本身获取这两个值:

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

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

awk 'NR==1055' "$nodes_file"

默认操作是打印该行,因此当条件NR==1055 为真时,awk 将执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2011-12-09
    • 2011-09-23
    相关资源
    最近更新 更多