我有一个看起来像这样的文件:
{% 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。 .. 的)?
答案 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