我有一个如下文件。 file1.csv
H,2 A:B,pq
D,34 C:B,wq
D,64 F:B,rq
D,6 R:B,tq
我想格式化第二列,如下所示
H,02 0A:0B,pq
D,34 0C:0B,wq
D,64 0F:0B,rq
D,06 0R:0B,tq
我可以将列分开并对其进行格式化但不能合并它 我使用以下命令
formated_nums =`awk -F"," '{print $2}' file1.csv | awk '{print $1}' | awk '{if(length($1)!=2){$1="0"$1}}1'`
formated_letters = `awk -F"," '{print $2}' file1.csv | awk '{print $2}' | awk -F":" '{if(length($1)!=2){$1="0"$1}; if(length($2)!=2){$2="0"$2}}1'| awk '{print $1":"$2}'`
现在我想将formated_nums和formated_letters与
之间的空格合并我尝试echo "${formated_nums} ${formated_letters}"
但它将变量作为行并将整个事物作为一行附加
答案 0 :(得分:1)
我在awk中找到的最简单的方法是使用另一种分隔,包括空格和':'并重新格式化最终布局。唯一真正棘手的部分是有时需要在前面添加0的数字,但它在格式化方面是微不足道的,因为数字永远不会超过2位数(这里)
awk -F '[[:blank:],:]' '{printf("%s,%02d 0%s:0%s,%s", $1, $2, $3, $4, $5)}' YourFile
假设您的数据格式相同(没有更大的最新字段,空格或其他"分隔符"内部)
答案 1 :(得分:0)
基于gnu awk的替代awk解决方案:
awk -F"[, :]" '{sub($2,sprintf("%02d",$2));sub($3,"0" $3);sub($4,"0" $4)}1' file1
H,02 0A:0B,pq
D,34 0C:0B,wq
D,64 0F:0B,rq
D,06 0R:0B,tq
答案 2 :(得分:0)
听起来这就是你真正想要的:
$ awk '
BEGIN { FS=OFS=","; p=2 }
{ split($2,t,/[ :]/); for (i in t) {n=length(t[i]); t[i] = (n<p ? sprintf("%0*s",p-n,0) : "") t[i]; $2=t[1]" "t[2]":"t[3]} }
1
' file
H,02 0A:0B,pq
D,34 0C:0B,wq
D,64 0F:0B,rq
D,06 0R:0B,tq