使用awk修改文件会删除其内容

时间:2018-02-11 14:31:29

标签: bash awk

我有一个看起来像这样的文件:

{% if personaldata is defined %}
{{ personaldata.name }}
...
{% endif %}

我使用A_,4.3.01.98 B_,4.3.01.98 C_,4.3.01.98 C_,4.3.01.98 E_,4.3.01.98 F_,4.3.01.98 G_,4.3.01.98 H_,4.3.01.98 来增加最后一个字段并且工作正常,但由于某种原因,在添加awk 'BEGIN{FS=OFS="."} {$4 = $4 + 1; print}' file_name [> file_name]时会删除文件内容... < / p>

第二个问题 - 如何确保增量不会超过99而是返回00(或任意N,即 98 - > 99 - > 50 - > 51。 .. 的)?

2 个答案:

答案 0 :(得分:1)

第一个问题的回答: 您必须添加awk中存在的选项,告诉它将更改保存到Input_file本身。 gawk具有相同的-i inplace选项,如果您拥有它,则可以使用它。如果需要备份,您也可以尝试gawk -i inplace -v INPLACE_SUFFIX=.bak

第二个问题的回答: 我已添加到解决方案中:由于我的awk是旧版本awk所以我做了另一种方式将输出保存到Input_file本身。我将输出输入到名为temp_file的输出文件中,然后放入&&条件以确保先前的awk命令已成功执行。然后我将temp_file重命名为Input_file本身。如果第4个字段小于99,则在此处添加一个条件,然后只需将1添加到其中,否则将其设置为0

关注awk可能会对您的两个问题提供帮助:

awk -F"." '{$4=$4<=99?$4++:0;print}' OFS="."  Input_file > temp_file && mv temp_file  Input_file

OR

awk -F"." '{$4=$4<=98?$4+1:0;print}' OFS="."   Input_file > temp_file && mv temp_file  Input_file

答案 1 :(得分:1)

原因如下:当shell看到awk '...' file > file时,shell执行的第一次事务是处理重定向以截断文件并打开它进行写入。只有这样,shell才会启动awk。但到那时文件是空的。

参考:https://www.gnu.org/software/bash/manual/bashref.html#Redirections

  

在执行命令之前,可以使用shell解释的特殊表示法重定向其输入和输出。 (强调我的)

moreutils linux软件包有一个sponge命令可用于此目的:

awk '...' file | sponge file