如何在unix中使用awk替换带日期的字符串?

时间:2014-01-09 12:50:12

标签: unix awk

我有以下代码:

v=`date "+%Y%m%d"`
awk -F, '{$2=$v;}1' OFS=, test.txt > test2.txt

其中test.txt是我的输入文件,test2.txt是输出文件。

test1.txt中的行符合以下格式:Unix,10,A

当我执行上面的脚本时,它会将test.txt

中的第一个和最后一个单词加倍

3 个答案:

答案 0 :(得分:0)

喜欢这个

awk -F, '{$2=v;}1' OFS=, v=`date "+%Y%m%d"` file
Unix,20140109,A

你不应该在awk内阅读变量 首先分配它们,十个使用它们。

v=`date "+%Y%m%d"`
awk -F, '{$2=var;}1' OFS=, var="$v" file

答案 1 :(得分:0)

如果打算用$v中的值替换第二个字段,则需要以某种方式将值传递给Awk。作为一个单独的过程,Awk不了解shell的内部变量。

awk -F, -v v="$v" '{$2=v}1' OFS=, test.txt > test2.txt

另请注意,Awk变量的名称仅为v。对于Awk,$v表示其编号位于变量v中的输入字段。

答案 2 :(得分:-1)

我会在这里推荐非遗留语法:

v=$(date "+%Y%m%d")

然后您可以使用这些awk调用中的任何一个:

awk -F, -v v="$v" '{$2=v}1' OFS=, test.txt > test2.txt
awk -F, '{$2=v}1' OFS=, v="$v" test.txt > test2.txt
awk -F, '{$2="'$v'"}1' OFS=, test.txt > test2.txt

或者,如果稍后在shell中不需要v变量,则可以使用以下任一项从date内部运行awk命令:

awk -F, 'BEGIN{"date \"+%Y%m%d\""|getline v}{$2=v}1' OFS=, test.txt > test2.txt

awk -F, 'BEGIN{v="'$(date "+%Y%m%d")'"}{$2=v}1' OFS=, test.txt > test2.txt 

或效率低下

awk -F, '{$2="'$(date "+%Y%m%d")'"}1' OFS=, test.txt > test2.txt