Chinaunix

标题: 拜请各位大牛,实在是搞不定了!!!! 急急急!!!!! [打印本页]

作者: 5itle    时间: 2011-11-14 23:17
标题: 拜请各位大牛,实在是搞不定了!!!! 急急急!!!!!
缘由:从数据库中导出的每天的增量文件, 每个字段用“|” 间隔,   由于所应用语言比较特殊处理文本相当的麻烦(百度都搜不到这种语言),决定用SHELL处理下文本,可是没搞定,希望高手帮帮忙
         之前问过一些,但始终没有达到理想的效果。可能我例举的不全 ,希望各位也帮着多想想

文件内容如下:一行
|0406|654321000000003632               |      |223501888812345678|张三   |0000|0000000.00|0000000000.00|00.00|011201|259|123456140000000013|00004062410|1234560100011900125=49121002147281   |43E39B564A4C9434|09JUL11|B|+000100.00|-000000888.88|0000300.00|00050|000.50|+100.50|+0001100.00|+000100|-100|-100.00|-00100.00|-00050|-00050.50|MBKIO     |011201CARDCENTER     |002617      |                 ]?垰??  |


要求:
      把多余的0去掉, 空格去掉,小数取有效数值,正负号不能去掉,不知道我说明白没有,但愿大牛们能听的懂

     例: |0406| 处理后 |406|
            |      |   处理后 ||
            |223501888812345678| 处理后 |223501888812345678|
            |张三   |  处理后   |张三|
            |0000|  处理后  ||
            |011201| 处理后 |11201|
            |09JUL11| 处理后 |9JUL11|
            |+000100.00|  处理后 |+100.00|
            |-000000888.88| 处理后 |-888.88|
            |0000300.00|   处理后 |300.00|
            |00050|     处理后 |50|
            |000.50|  处理后  |0.50|
            |+000100|  处理后 |+100|
            |-00100.00|  处理后 |-100.00|
            |-00050.50|  处理后 |-50.50|
            |011201CARDCENTER     | 处理后 |011201CARDCENTER|


之前请教各位大牛遇到的问题:   数太长  处理后变成科学计数法了,正负号 小数点 处理不好,总会截错位置。。。

   本人搞了三四天,实在搞不定了。。。。。。。。。。
作者: 5itle    时间: 2011-11-14 23:32
  1. `awk -v FS=\| -v OFS=\| '{for(i=1;i<=NF;i++){sub(/^ +/,"",$i);$i=($i==0)?"":$i} }1' ${NAME} > temp.txt`


  2. `sed -e :a -e 's/|[0.+][+.0]*|/||/g;s/ //g;ta' temp.txt > temp_1.txt`

  3. `sed 's/+0*\([^0|.]\)/+\1/g;s/0*\(0\.0*[^0]*\)[^|]*/\1/g' temp_1.txt > temp_2.txt`
复制代码
这些是之前请教各位大牛给出的代码

我整理运行之后  还是有一些问题
作者: lkk2003rty    时间: 2011-11-14 23:33
  1. echo "|0406|654321000000003632               |      |223501888812345678|张三   |0000|0000000.00|0000000000.00|00.00|011201|259|123456140000000013|00004062410|1234560100011900125=49121002147281   |43E39B564A4C9434|09JUL11|B|+000100.00|-000000888.88|0000300.00|00050|000.50|+100.50|+0001100.00|+000100|-100|-100.00|-00100.00|-00050|-00050.50|MBKIO     |011201CARDCENTER     |002617      | "  | sed -r 's/\s+//g;s/0*?(0\.)/\1/g;s/0+([1-9])/\1/g;s/\|0*\|/||/g'
复制代码

作者: 5itle    时间: 2011-11-14 23:34
大家帮忙把帖子顶起来吧, 期待大牛出现。。。。
作者: 5itle    时间: 2011-11-14 23:37
回复 3# lkk2003rty


    这位兄弟  |0406|  处理后变成|46 | 这样不行啊  要变成|406| 才成啊


    依然感谢你
作者: lkk2003rty    时间: 2011-11-14 23:50
本帖最后由 lkk2003rty 于 2011-11-15 00:12 编辑
  1.   sed -r 's/\s+//g;s/\|0*\|/||/g;s/\|0*([1-9]\d*(\.\d*)?)/|\1/g;s/\|(\+|-)0*([1-9]\d*(\.\d*)?)/|\1\2/g;s/\|0*\./|0./g'

复制代码
回复 5# 5itle
作者: 5itle    时间: 2011-11-14 23:57
回复 6# lkk2003rty


    |0406|654321000000003632               |  处理为    |406|654321000000003632|


兄弟你的代码处理为 |46|6543213632| 了  这样不行呀。。  还有别的办法吗
作者: 5itle    时间: 2011-11-14 23:59
回复 6# lkk2003rty


    |+100.50|   也处理成 |+10.50|了  不知道咋少了一位
作者: lkk2003rty    时间: 2011-11-15 00:04
回复  lkk2003rty


    |+100.50|   也处理成 |+10.50|了  不知道咋少了一位
5itle 发表于 2011-11-14 23:59



    i fix it  u can try again
作者: zooyo    时间: 2011-11-15 00:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: yinyuemi    时间: 2011-11-15 01:42
  1. sed -r -e 's/\s+//g' -e 's/(\|[+-]?)0{1,}/\1/g' -e 's/\|\./|0./g'
复制代码

作者: waker    时间: 2011-11-15 08:13
看不太清晰,希望以前的帖子对你有所帮助

http://bbs.chinaunix.net/thread-3613795-1-1.html
http://bbs.chinaunix.net/thread-3613978-1-1.html
作者: 5itle    时间: 2011-11-15 08:30
回复 12# waker


    这位大牛上回帮我回答的那个AWK,   处理之后    20为的整数 就变成科学计数法了。。。。
作者: expert1    时间: 2011-11-15 09:44
up ,看看先
作者: jiejie455    时间: 2011-11-15 10:23
试试这个
sed -e 's/[ \t]\+//g' -e 's/0*\([1-9.][0-9.]*|\)/\1/g' data
sed -r 's/\|[0.]0+/|0/g' data
作者: _man_mk_    时间: 2011-11-15 10:40
可不可以这样?大体思路如下,一步一步来。 可能有些地方不对。



sed -e 's/[ \t]*//g' -e 's/|\([-+]\)00*/|\1/g'  -e 's/|00*/|/g'  -e 's/\(\.[1-9]*\)00*|/\1|/g'  -e 's/|\./|0\./g' -e 's/\(\.[0-9]\)|/\10|/g'  -e 's/\.|/.00|/g'  filename


's/[ \t]*//g' 除空格

's/|\([-+]\)00*/|\1/g'       删除 +-后 无用的 0   -> |(+-)00000123123| -> |(+-)123123|

s/|00*/|/g  删除 开始无用的0   |00000123123| -> |123123|

s/\(\.[1-9]*\)00*|/\1|/g    删除小数点后无用的0


s/|\./|0\./g  修正 |. -> |0.

s/\(\.[0-9]\)|/\10|/g 修正  一位小数为   两位小数

s/\.|/.00|/g 修正 有小数点,没有小数的为 2位小数
作者: jason680    时间: 2011-11-15 10:56
这问题这么火....

这问题,不是不能解,而在于lz说明不清,遗漏一堆
1. 这个没说明....
   0000000.00|0000000000.00|00.00  处理后??
注:有说明|0000|  处理后  ||

2. 同样都是0开头,却有不同结果....什么规则..??
|011201CARDCENTER | 处理后|011201CARDCENTER|
|09JUL11| 处理后 |9JUL11|

有人说:有完整的问题,才会有完整的答案....
作者: liaoliaofannao    时间: 2011-11-15 14:10
看下 对着方面不太了解 不过帮你顶下
作者: ljs4053    时间: 2011-11-15 15:40
回复 1# 5itle


    建议你采用分步来做,比如说第一步我只做去掉前面的0啊什么的,不要一口气来啊,




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2