我必须使用unix命令更改文件第一列的所有值(免除标头)。
我尝试以下但它似乎删除了我的文件中的所有内容:
awk -F \ | -v val =“……
awk -F\| -v val="20190306" '{gsub($1,val); print}' file > file # ......................................................^^^^^^
您的文件被截断为零长度 的 之前 强> awk命令甚至开始。然后shell处理重定向 第一 。
您需要输出到临时文件,然后将临时文件移动到原始文件 如果 awk命令成功:
tmp=$(mktemp) awk ... file > "$tmp" && mv "$tmp" file
您可以使用其他技术:
moreutils
awk ... file | sponge file
你误导我们自己的代码,没有样本输入和输出...... 基于您在评论中显示的输入和输出,我相信这更好用sed:
val='20190306' sed -e 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/'"${val:0:4}-${val:4:2}-${val:6:2}"'/g' file
或者在这种情况下,这项工作也是如此:
sed -e "s/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/${val:0:4}-${val:4:2}-${val:6:2}/g" file
当输出看起来很好时,添加 -i 开关( sed -i -e ... )在适当的位置更改文件。
-i
sed -i -e ...
如果你想使用awk:
awk -v newd="${val:0:4}-${val:4:2}-${val:6:2}" '{gsub(/[0-9]{4}(-[0-9]{2}){2}/, newd);}1' file
但既然你没有 GNU awk v4.1.0+ ,你不能使用 -i inplace 改变到位。 你可以试试:
GNU awk v4.1.0+
-i inplace
awk -v newd="${val:0:4}-${val:4:2}-${val:6:2}" '{gsub(/[0-9]{4}(-[0-9]{2}){2}/, newd);}1' file | tee file
如果它不起作用,你将不得不使用临时文件,如下所示:
awk -v newd="${val:0:4}-${val:4:2}-${val:6:2}" '{gsub(/[0-9]{4}(-[0-9]{2}){2}/, newd);}1' file > temp_file mv -f temp_file file