awk:在特定符号后替换字符

考虑文件的列,该列指定日期,如下所示2006-02-04。对于包含日和月且前导零的所有行,期望的输出为2006-2-4

使用awk命令和gsub()如何实现这一目标?

如果网站上的另一个问题已回答该问题,则将删除该问题。

laohu1959 回答:awk:在特定符号后替换字符

您可以使用gensub将字符串与后向引用匹配,然后替换为零。以下是普通的BEGIN块中的一个(愚蠢的)示例:

awk 'BEGIN { x = "2006-02-04"; 
      x = gensub(/([0-9]{4})-0([0-9])-0([0-9])/,"\\1-\\2-\\3",1,x); 
      print x 
}' </dev/null

将输出:

2006-2-4

如果您知道输入格式是“精确的”,那么,如果正确的字符等于substr ...,就可以0进行输入:

awk 'BEGIN { x = "2006-02-04"; 
    if (substr(x,9,1) == "0") { x = substr(x,8) substr(x,10); } 
    if (substr(x,6,5) substr(x,7); }; 
    print x; 
}' </dev/null
,

为什么使用gsub

cat file
Mon 2006-02-04 Green
Tue 2006-02-05 Blue
Wed 2006-02-06 Yellow
Fri 2006-12-22 Brown

awk '{split($2,a,"-");$2=a[1]"-"a[2]+0"-"a[3]+0}1' file
Mon 2006-2-4 Green
Tue 2006-2-5 Blue
Wed 2006-2-6 Yellow
Fri 2006-12-22 Brown

只需将0添加到字段中,然后前导0就消失了。

,

这个awk脚本怎么样? (将其放入文件中,例如script.awk

{
 for (i=1;i<=NF;i++) { 
  gsub(/^0/,"",$(i)); 
  printf $(i)
  if (i != NF) { printf "-" }
 }
}

通过以下方式调用:awk -f script.awk -F "-" <<< "2006-02-04"

本文链接:https://www.f2er.com/3160291.html

大家都在问