【问题标题】:awk: fatal: cannot open file `-v' for reading (No such file or directory) [closed]awk:致命:无法打开文件“-v”进行读取(没有这样的文件或目录)[关闭]
【发布时间】:2022-01-05 15:57:06
【问题描述】:

我是 awk 的新手。我知道 -v 表示变量,所以我尝试在 shell 的每个变量中执行它。但我不知道为什么我会收到这个错误。有人能帮我吗?我的代码有问题吗?

        awk -v row_no=$row_no -v item=$item -v itemType=$itemType -v quantity=$quantity -v price=$price '{  NR==row_no;
                                                                                                                    $1=item
                                                                                                                    $2=itemType
                                                                                                                    $3=quantity
                                                                                                                    $4=price
                                                                                                                     }1' file.txt > tmp.txt && mv tmp.txt file.txt

我得到的错误是:

awk: fatal: cannot open file `-v' for reading (No such file or directory)

【问题讨论】:

  • 我无法重现此内容。您能告诉我们您使用的是哪个版本的 awk 以及您在哪个系统上运行它吗?
  • 您用bash 标记了您的问题。 bash tag info 告诉您“对于有语法或其他错误的 shell 脚本,请在此处发布之前在 shellcheck.net 检查它们” - 请在以后的问题中这样做,这样我们就不必告诉您该工具的此类错误本来可以告诉你的。

标签: linux shell awk


【解决方案1】:

首先,如果您的 shell 变量包含空格,您的 awk 命令可能会失败,因此,请引用您的变量。例如,awk .... -v item="$item"....

第二,

awk ... '{  NR==row_no;                                                         
$1=item
$2=itemTyp
....}1'

语法错误。

NR==row_no{...}{if (NR==row_no){....}}。最后的1 是什么意思?你想打印所有行吗?如果您只想打印带有NR==row_no 的行,可以将print 放入{...} 块并删除1

您的目标是更新输入中带有NR==row_no 的行。 如果是这样,你可以试试这个:

awk -v var="$shellVar" -v .... 
    'NR==row_no{$1=...; $2=...;$3=...;}1' input.file > tmp.file && mv ...

我认为这个小例子模拟了你想要的:

$ seq 5 | awk -v row="3" 'NR==row{$1="hi"}1'
1
2
hi
4
5

【讨论】:

    【解决方案2】:

    由于您没有引用 shell 变量,因此其中一个变量的值可能是由空格分隔的两个单词。这使得值经历word splitting 并导致第一个单词作为声明的一部分出现,而另一个单词被解释为代码。这会导致以下选项(-v)被解释为文件参数,从而向您显示错误awk: fatal: cannot open file ``-v' for reading (No such file or directory)。第一个词也可能只是一个空词。

    【讨论】:

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