首页 > 解决方案 > awk:特定符号后的替换字符

问题描述

考虑一个指定日期的文件列,如下所示2006-02-04。所需的输出2006-2-4适用于包含前导零的日期和月份的所有行。使用带有 gsub() 的 awk 命令如何实现这一点?

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

标签: bashawk

解决方案


您可以使用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

推荐阅读