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

时间:2019-11-05 10:47:13

标签: bash awk

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

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

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

3 个答案:

答案 0 :(得分:1)

您可以使用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, 0, 8) substr(x, 10); } 
    if (substr(x, 6, 1) == "0") { x = substr(x, 0, 5) substr(x, 7); }; 
    print x; 
}' </dev/null

答案 1 :(得分:1)

为什么使用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就消失了。

答案 2 :(得分: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"