附加到有条件的字段

附加到有条件的字段

输入:

1,2,20,11
1,1,2018,111

输出:

1,02,20,11
1,01,18,111

我想插入0到字段 2(月份),以防它是单个数字。

并希望从字段 3(年份)中删除前 2 位数字,以防它是 4 个数字。

答案1

使用 awk

awk -F, -v OFS=, '                { $2 = sprintf("%02d", $2)   }
                  length($3) == 4 { sub("^[0-9][0-9]", "", $3) } 1' file

这无条件地将第二个逗号分隔字段重新格式化为零填充的两位整数。如果第三个字段的长度为四个字符,则删除其前两位数字。然后打印结果记录。

答案2

使用awk

awk -F, '{ printf("%d,%02d,%d\n" ,$1, $2, substr($3, length($3)-1) ) }' infile
  • length($3)返回column3的长度;-1用于让substr($3, START[, LEN])返回长度为字符从倒数第二个数字位置开始为开始(就是length($3)-1现在)。如果可选的其余部分被省略开始用来。

编辑对于修改后的问题(现在有 4 列):

awk -F, '{
    printf("%d,%02d,%d%s\n" ,$1, $2, substr($3, length($3)-1), ($4?","$4:"") )
}' OFS= infile

对于一般情况,其中 N 列(至少3个):

awk -F, '{
     printf("%d,%02d,%d" ,$1, $2, substr($3, length($3)-1) ) }
{ $1=$2=$3=""; printf ("%s\n", (NF>3?","$0:"") ) }' OFS= infile

答案3

input file

1,2,20,11
1,1,2018,111

命令

awk -F ',' '{if(length($2)==1)$2="0"$2;print $0}' inputfile | awk '{if(length($3)==4)$3=substr($3,3,2);print $0}'| sed 's/ /,/g'

输出

1,02,20,11
1,01,18,111

答案4

处理这种情况的一种方法如下所示:

命令

perl -pe 's|^\d+,\K(\d)?(\d),(\d\d)(\d\d)?(?=,)|($1//0)."$2,".($4//$3)|e' input.txt

输出

1,02,20,11
1,01,18,111

解释:

s|
^\d+,\K(?# 将第一个逗号分隔字段保留在左侧)

(?# $1 $2) (\d)?(\d), (?# 可能是一个数字后跟一个确定的数字)

(?# $3 $4) (\d\d)(\d\d)? (?# 两个数字后面可能还有两个数字)

(?=,) (?# 我们应该在右侧看到一个逗号)

|($1//0)."$2,".($4//$3)|e

($1 // 0) 表示在 $1 未定义的情况下使用 0,IOW,字段二是个位数。 ($4 // $3) 表示在 $4 未定义的情况下使用 $3,IOW,根据位数选择其中一个双元组。

s/// 命令中的 /e 标志会将 RHS 视为 Perl 代码,并应使用提供的任何参数对其进行评估,并将此评估的结果作为 s/// 命令的 RHS。

相关内容