免费注册 查看新帖 |

Chinaunix

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

请教两文本对应列替换的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-06-23 17:55 |只看该作者 |倒序浏览
有个文本abc如下:
a|2003-02-01 12:12:24|cc  |234
b|2003-01-01 11:14:15|dd_daff  |33444
........


转化的格式如下:
'#'|to_date('#','yyyy-mm-dd hh24:mi:ss')|trim('#')|#
也就是#分别替换成为文本中相应的列("|"是分割符号)

结果如下:
'a'|to_date('2003-02-01 12:12:24','yyyy-mm-dd hh24:mi:ss')|trim('cc ')|234
'b'|to_date('2003-01-01 11:14:15','yyyy-mm-dd hh24:mi:ss')|trim('dd_daff  ')|33444
......     
用shell有什么好的方法实现?

论坛徽章:
0
2 [报告]
发表于 2003-06-23 18:28 |只看该作者

请教两文本对应列替换的问题


  1. awk -F"|" "{printf(\"'%s'|to_day\('%s','yyyy-mm-dd hh24:mi:ss')|trim\('%s'\)|%s\n\",\$1,\$2,\$3,\$4)}" urfile
复制代码

论坛徽章:
0
3 [报告]
发表于 2003-06-23 19:09 |只看该作者

请教两文本对应列替换的问题

多谢nkliyong  的答复!
请允许我把这个问题延伸一下,从而得到一个通用脚本:

要转换的数据存放在 abc.dat中
转化的格式存放在一个参数文件a.ini中,
这样的话,这个a.ini文件的内容是可根据需要转换的dat文件的不同动态配置的
可有一列或者多列,可以是
'#'|to_date('#','yyyy-mm-dd hh24:mi:ss')|trim('#')|#
也可以是其他格式,比如
'#'|to_date('#','yyyy-mm-dd hh24:mi:ss')|to_date('#','yyyy-mm-dd hh24:mi:ss')|# |#
等等,根据dat文件的不同而不同
但是
#分别替换成为dat文本中相应的列("|"是文本的列分割符号)
这个转换规则不变

我尝试了用双层循环来解决,但是觉得太复杂,如果awk可嵌套的话,就好了.

论坛徽章:
0
4 [报告]
发表于 2003-06-23 19:29 |只看该作者

请教两文本对应列替换的问题

你是指abc.dat文件可能有几个时间的字段?
a.ini文件中放的是什么?

论坛徽章:
0
5 [报告]
发表于 2003-06-23 19:42 |只看该作者

请教两文本对应列替换的问题

对,abc.dat中可能有多个时间的字段,而且字段的总个数也是任意的,
a.ini放的就是对这个abc.dat文件的一种格式化信息,这个需要人为的根据abc.dat
各字段意义的不同,在执行转化脚本之前人工配置

比如,想转化
cat abc.dat
123|123|ccc
333|777888|ddd
这种简单的dat文件,就只需要把a.ini
配置成为
#|#|'#'
就可以了

而想要转化复杂的,比如上面的例子,就修改a.ini,而不需要每次都修改shell

论坛徽章:
0
6 [报告]
发表于 2003-06-23 20:09 |只看该作者

请教两文本对应列替换的问题

1,多个时间字段可以这样解决

  1. awk -F"|" "{printf(\"'%s'\",\$1);
  2. for(i=2;i<NF-1;i++){printf(\"|to_day\('%s','yyyy-mm-dd hh24:mi:ss'\)\",\$2)};
  3. {printf(\"|trim\('%s'\)|%s\n\",\$(NF-1),\$NF)}}" abc.dat
复制代码


2.如果a.ini有固定个字段,应该可以解决,但看你的要求abc.dat域是变化的,a.ini难道有几行不同的格式和她对应?

论坛徽章:
0
7 [报告]
发表于 2003-06-23 20:21 |只看该作者

请教两文本对应列替换的问题

sorry,ini的问题是我没有说清楚:
对于每个abc.dat文件,他的格式所有的行都是相同的,用a.ini描述,一行就够了

.dat的不同是不同的文件
比如def.dat ,就用b.ini来解释,
xyz.dat 就用c.ini来解释

但 abc.dat ,xyz.dat,def.dat,他们内部所有行的格式都是一致的

论坛徽章:
0
8 [报告]
发表于 2003-06-23 20:26 |只看该作者

请教两文本对应列替换的问题

sorry 偶有事先走,明天再看.
再次sorry.

论坛徽章:
0
9 [报告]
发表于 2003-06-24 04:23 |只看该作者

请教两文本对应列替换的问题

...

明白了,就是想做个模板。


  1. cat a.ini a.dat | awk -F'|' '{
  2.    if ( NR == 1 ) {
  3.        split($0,a,"|")
  4.        next
  5.    }
  6.    for ( i=1; i<=NF; i++ ) {
  7.        b=a[i]
  8.        sub("#", $i, b)
  9.        if ( i < NF )  printf b "|"
  10.        else print b
  11.    }
  12. }'
复制代码

论坛徽章:
0
10 [报告]
发表于 2003-06-24 09:05 |只看该作者

请教两文本对应列替换的问题

[quote]原帖由 "红袖添香"][/quote 发表:
     
高,实在是高!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP