输入:
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。