我有这样的记录
1664|41.0000|0.683333|0.6560|
命令
$ awk -F“|” '/AL_ALL_CALLS_1.6P/ {if($ 22> 0&& $ 182!=“”&&!$ 183) 打印$ 3,$ 7,$ 10,$ 12,$ 15,$ 22,$ 24,$ 36,$ 39,$ 40,$ 96,$ 103,$ 182,$ 184,$ 186}' CDR_File_1.txt | awk -F“|” '{for(i = 1; i< = NF; i ++){if($ i ==“”){ $ i =“0”}} OFS =“”; print}'| awk -F“”'{print $ 1,$ 2,$ 3,$ 4,$ 5,$ 6,$ 6/60,$ 7,$ 8,$ 9,$ 10,$ 11,$ 12,$ 13,$ 14,$ 15}'| sed“s / / | / g“| awk -F”[|。]“'{for(i = 1; i< = NF; i ++){if($ i == $ i + 0) {N =分裂($ I,A, “”); $ i = sprintf(“%d%d”,a [1],a [2])}}} 1'|头-1 -
输出
1664 0 41 0 0 0 0 0 683333 0 0 0 6560
预期
1664 41 0000 0 683333 0 6560
答案 0 :(得分:1)
只需检查给定字段是否为数字,在这种情况下,将其拆分:
awk '/anu/ { # lines containing "anu"
for (i=1;i<=NF;i++) { # loop through the fields
if ($i==$i+0) { # if it is a number
n=split($i,a,".") # slice the number
$i=sprintf("%d %d", a[1], a[2]) # put it back together with a space
}
}
}1' file # print the line
看到它的实际效果:
$ awk '/anu/ {for (i=1;i<=NF;i++) {if ($i==$i+0) {n=split($i,a,"."); $i=sprintf("%d %d", a[1], a[2])}}}1' file
45 0 0 25 abc anurag.jain
25.12 1.25 xyz stack
这里的关键点是使用printf
中的format-control letter %d
来删除现在多余的前导零:
$ awk 'BEGIN {printf "%d %d", 0000001, 01}'
1 1
此外,使用$var == $var +0
来检查字段是否为数字:
$ awk 'BEGIN {print "a" == "a" + 0}'
0
$ awk 'BEGIN {print 23.0 == 23.0 + 0}'
1
根据您更新的问题,我发现您不需要删除额外的零:使用$i=sprintf("%s %s", a[1], a[2])
我们已经绰绰有余了。此外,由于您的整数不需要额外处理,因此最好以不同方式检查这些字段,例如使用$i~/^[0-9]+\.[0-9]+$/
。
$ awk -F"|" '{for (i=1;i<=NF;i++) {if ($i~/^[0-9]+\.[0-9]+$/) {n=split($i,a,"."); $i=sprintf("%s %s", a[1], a[2])}}}1' file
1664 41 0000 0 683333 0 6560