免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3127 | 回复: 19
打印 上一主题 下一主题

学习随笔:awk点点滴滴01-metaxing [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-30 20:05 |只看该作者 |倒序浏览
问题发生环境:
     我们的操作维护系统升级后,原始数据发生变化,但是对应的工具已经没有开发团队继续开发和支持了,而老的工具无法正常导入新的系统配置数据!
   根据错误提示确定问题发生的对应的源文件,对此文件200多个字段分析后发现,是由于此文件中有5个字段的值的类型由升级前的整数变为升级后的浮点型,导入工具导入这五个字段的时候提示出错,而不能正常导入,而这个文件恰恰是其中最关键的文件,不能缺少,对这几个字段分析发现,其中的值全为0.00,而且目前网络对此具体值并不敏感,可以直接替换为整数0,本人就在网上搜索相关主题,最后发现可以直接使用awk对这几个字段进行替换.

解决方法如下:

在原始处理数据的shell中增加如下两句
mv BTS.txt BTSorg.txt
$Rep_Tools/gawk -F';' '{OFS=";"}{$165="0";$166="0";$167="0";$168="0";$205="0";print}' BTSorg.txt > BTS.txt

说明:
1.我们的源文件名为BTS.TXT,首先将源文件通过mv命令改名BTSorg.txt.作为处理时的输入文件,也作为原数据予以保留
2.通过第二行的指令对更名后源文件BTSorg.txt中第165,166,167,168,205字段直接替换为0,并使用print输出更新后的整行内容到BTS.txt
处理前后的文件见附件!
处理前的文本文件内容: BTSorg.zip (32.47 KB, 下载次数: 28)
处理后的文本文件内容: BTS.zip (32.33 KB, 下载次数: 21)

此问题解决了数据不能正常导入的问题,但并非最完美的解决方案,还存在以下问题:
1.因为这个源文件首行是标题行,此命令将标题行对应列的标题也改为了0
2.假如这些列的数据非0,如是8.00,此命令改变了原始值

为了真正掌握相关awk知识,寻求尽可能完美的解决方法,在此将此问题提出,欢迎坛友能给出更好的建议
1.解决在替换时不替换标题行,也就是第一行对应列的内容
2.将这些列不直接赋0,而是将原值转换为整型数付给对应列,尽可能把对原始数据的影响降到最低!

[ 本帖最后由 metaxing 于 2008-12-30 20:20 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-12-30 22:36 |只看该作者
为了真正掌握相关awk知识,寻求尽可能完美的解决方法,在此将此问题提出,欢迎坛友能给出更好的建议
1.解决在替换时不替换标题行,也就是第一行对应列的内容
2.将这些列不直接赋0,而是将原值转换为整型数付给对应列,尽可能把对原始数据的影响降到最低!

修改如下
awk -F";" 'NR==1;NR>1 {for (i=1;i<=NF;i++) {printf("%d",$i);printf(";")};printf("\n")}' btsorg.txt > bts.txt

论坛徽章:
0
3 [报告]
发表于 2008-12-30 22:56 |只看该作者
$Rep_Tools/gawk  'BEGIN {FS=OFS=";"} NR==1;NR>1{$165=printf("%d",$165);$166=printf("%d",$166);$167=printf("%d",$167);$168=printf("%d",$16;$205=printf("%d",$205);print}' BTSorg.txt > BTS.txt

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
4 [报告]
发表于 2008-12-30 23:01 |只看该作者
原帖由 ywlscpl 于 2008-12-30 22:56 发表
$Rep_Tools/gawk  'BEGIN {FS=OFS=";"} NR==1;NR>1{$165=printf("%d",$165);$166=printf("%d",$166);$167=printf("%d",$167);$168=printf("%d",$16;$205=printf("%d",$205);print}' BTSorg.txt > BTS.txt

printf不能这么用吧。是sprintf?

论坛徽章:
0
5 [报告]
发表于 2008-12-30 23:13 |只看该作者
原帖由 ynchnluiti 于 2008-12-30 23:01 发表

printf不能这么用吧。是sprintf?


可以啊,printf格式化输出

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
6 [报告]
发表于 2008-12-30 23:19 |只看该作者
原帖由 ywlscpl 于 2008-12-30 23:13 发表


可以啊,printf格式化输出

但你用的是
  1. $167=printf("%d",$167);
复制代码

你的环境可以?
我这里不能运行。

论坛徽章:
0
7 [报告]
发表于 2008-12-30 23:43 |只看该作者
里面都有一个NR==1;
应该可以简化掉吧?

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
8 [报告]
发表于 2008-12-31 01:11 |只看该作者

回复 #6 ynchnluiti 的帖子

sprintf()返回字串,printf不行。

论坛徽章:
0
9 [报告]
发表于 2008-12-31 07:59 |只看该作者
原帖由 ynchnluiti 于 2008-12-31 01:11 发表
sprintf()返回字串,printf不行。


#awk -v v1=10.1 -v v2=9.1 'BEGIN{printf("%d %d\n",v1,v2)}'
10 9

#awk -v v1=10.1 -v v2=9.1 'BEGIN{printf "%d %d\n",v1,v2}'
10 9

我一般用第一种,printf格式化输出,返回的不一定是字串,跟shell及C里的printf应该差不多

[ 本帖最后由 ywlscpl 于 2008-12-31 08:02 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-12-31 08:44 |只看该作者
# echo "1 2" | awk '{printf (%d)}'
awk: not enough args in printf(%d)
input record number 1, file -

# echo "1 2" | awk '{printf "%d"}'
awk: not enough args in printf(%d)
input record number 1, file -

两者错误提示一样,printf "%d" ,被解释成printf(%d)

另:# echo "1 2" | awk '{printf $1","$2"\n",sljdfisd$2,$3}'
1,2

printf当print用, "\n"后面这些全部被无视
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP