在unix

时间:2017-05-17 06:36:48

标签: shell unix awk

我有一个如下文件。 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}"但它将变量作为行并将整个事物作为一行附加

3 个答案:

答案 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