awk:致命:无法打开文件“-v”进行读取(没有这样的文件或目录)

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

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

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

我得到的错误是:

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

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

第二,

awk ... '{  NR==row_no;                                                         
=item
=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' input.file > tmp.file && mv ...

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

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

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