免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yinyuemi
打印 上一主题 下一主题

[文本处理] 中秋送题目^_^ [复制链接]

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
71 [报告]
发表于 2014-09-10 11:36 |只看该作者
本帖最后由 jason680 于 2014-09-10 11:37 编辑

@blackold @damcool

Would you like this to sort it by special key with log for asorti function in awk

$ awk '{d=$0;k="";for(n=1;n<=NF;n++){if($n=="-")x=9999;else{b=7500;if($n>0){x=log($n)+7500}else{x=2500-log(-$n)};if($n=="0")x=5000};k=sprintf("%s%019.15f,",k,x)}a[k]=a[k]d"\n"}END{t=asorti(a,s);for(n=1;n<=t;n++)printf a[s[n]]}' FILE

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
72 [报告]
发表于 2014-09-10 11:40 |只看该作者
ly5066113 发表于 2014-09-09 10:19
回复 57# blackold

@damcool


这是本贴中最棒的代码:ly5066113
  1. sort -gr file | awk 'BEGIN{n=1}{if($n=="-"&&$(n+1)!="-")n++;a[n]=a[n]?$0"\n"a[n]:$0}END{for(i=1;i<=n;i++)printf a[i]}'
复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
73 [报告]
发表于 2014-09-10 11:41 |只看该作者
jason680 发表于 2014-09-10 11:36
@blackold @damcool

Would you like this to sort it by special key with log ...


Your stuck in the wrong direction from the starting. Give it up and find a new way instead!

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
74 [报告]
发表于 2014-09-10 11:57 |只看该作者
回复 71# jason680


    结果和其它几位的答案一样,有个小问题——重排。

    这要看原始需求了。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
75 [报告]
发表于 2014-09-10 13:26 |只看该作者
@blackold @damcool

it seems no issue and just for your reference

$ awk '{d=$0;k="";for(n=1;n<=NF;n++){if($n=="-")x=9999;else{b=7500;if($n>0){x=log($n)+7500}else{x=2500-log(-$n)};if($n=="0")x=5000};k=sprintf("%s%019.15f,",k,x)}a[k]=a[k]d"\n"}END{t=asorti(a,s);for(n=1;n<=t;n++)printf a[s[n]]}' file
-55         -        -        2
-55         -        -        3
-45         -        -        2
-5         -        -        3
-1        15         -        -
-5.3400000000e-10         -        -        0
-5.3500000000e-11         -        -        0
-5.3400000000e-11         -        -        0
-5.3400000000e-11         -        -        0
-5.3400000000e-12         -        -        0
0        15         -        -
5.3400000000e-12         -        -        0
5.3400000000e-11         -        -        0
5.3400000000e-11         -        -        0
5.3500000000e-11         -        -        0
5.3400000000e-10         -        -        0
1        15         -        -
33         -        -        -
34         -        4         -
35         -        -        3
36         -        54         3
37         13         -        0
38         -        -        -
39         -        43         0
40         12         -        0
41         -        -        2
42         -        -        2
43         -        -        3
46         -        0         3
47         -        3         0
48         -        0         23
49         -        3         0
50         -        0         -
5.3400000000e+11         -        -        0
-        11         -        0
-        12         -        0
-        13         -        -
-        14         -        -
-        15         -        -
-        -        22         0
-        -        23         0
-        -        24         0
-        -        25         0
-        -        -        2
-        -        -        4
-        -        -        4
-        -        -        5

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
76 [报告]
发表于 2014-09-10 13:34 |只看该作者
本帖最后由 blackold 于 2014-09-10 15:05 编辑

回复 75# jason680

    37         1         -        0
    37         13         -        0


不重排时结果为:
37         13         -        0
37         1         -        0

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
77 [报告]
发表于 2014-09-10 13:42 |只看该作者
回复 76# blackold

No any issue here

$ awk --version
GNU Awk 3.1.8
...
Note: OS: ubuntu 12.04 LTS


$ cat F
37                1                -         0
37                13                -         0
37                113                -         0
37                -1                -         0
37                -31                -         0
36                1                -         0
38                1                -         0
13                1                -         0
1                1                -         0
37                1.0                -         0
37                1.1                -         0
37                1.1e-1                -         0
37                1.1e-13                -         0
37                1.1e-12                -         0
37                1.1e-11                -         0
37                -1.1e-1                -         0
37                -1.1e-13                -         0
37                -1.0                -         0

$ awk '{d=$0;k="";for(n=1;n<=NF;n++){if($n=="-")x=9999;else{b=7500;if($n>0){x=log($n)+7500}else{x=2500-log(-$n)};if($n=="0")x=5000};k=sprintf("%s%019.15f,",k,x)}a[k]=a[k]d"\n"}END{t=asorti(a,s);for(n=1;n<=t;n++)printf a[s[n]]}' F

1                1                -         0
13                1                -         0
36                1                -         0
37                -31                -         0
37                -1                -         0
37                -1.0                -         0
37                -1.1e-1                -         0
37                -1.1e-13                -         0
37                1.1e-13                -         0
37                1.1e-12                -         0
37                1.1e-11                -         0
37                1.1e-1                -         0
37                1                -         0
37                1.0                -         0
37                1.1                -         0
37                13                -         0
37                113                -         0
38                1                -         0

   

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
78 [报告]
发表于 2014-09-10 14:22 |只看该作者
jason680 发表于 2014-09-10 13:26
@blackold @damcool

it seems no issue and just for your reference


No issue? Please find the sample data and result from below. I would say idea is good, but the implementation is terrible.
  1. 10000   -       10001   -       1
  2. 5.3400000000e+19999     -       -       -       0
  3. 0       10      -       -       -
  4. -       -       100     -       100
  5. -       -10000  -       -       -
  6. -       999     -       10      -
  7. -       0       -       -       -
  8. -       -       -       -       -
复制代码
  1. 5.3400000000e+19999     -       -       -       0
  2. 0       10      -       -       -
  3. 10000   -       10001   -       1
  4. -       -10000  -       -       -
  5. -       0       -       -       -
  6. -       999     -       10      -
  7. -       -       100     -       100
  8. -       -       -       -       -
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
79 [报告]
发表于 2014-09-10 14:33 |只看该作者
本帖最后由 jason680 于 2014-09-10 15:05 编辑

回复 78# damcool

maybe it's your issue when you use none-normal number in normal question
Note: sort also have some issue when you didn't define the range of number


IEEE二進位浮點數算術標準IEEE 754
http://zh.wikipedia.org/wiki/IEEE_754


$ echo 5.3400000000e+19999 | awk '{print $1}'
5.3400000000e+19999

$ echo 5.3400000000e+19999 | awk '{print $1+0}'
inf

$ echo 5.3400000000e+308 | awk '{print $1+0}'
inf

$ echo 5.3400000000e+307 | awk '{print $1+0}'
53399999999999996834102215886847073375442192858428021737048535051625972581433920698886860960863720196377732197475988075372789144436945748499132524731853906391056088069083166315551794351539218676171780989529694725891652652655135617391477042922865451526518735389409861552838517818551646040134617938993000480768

$ cat s
10000   -       10001   -       1
5.3400000000e+307     -       -       -       0
0       10      -       -       -
-       -       100     -       100
-       -10000  -       -       -
-       999     -       10      -
-       0       -       -       -
-       -       -       -       -

$ awk '{d=$0;k="";for(n=1;n<=NF;n++){if($n=="-")x=9999;else{b=7500;if($n>0){x=log($n)+7500}else{x=2500-log(-$n)};if($n=="0")x=5000};k=sprintf("%s%019.15f,",k,x)}a[k]=a[k]d"\n"}END{t=asorti(a,s);for(n=1;n<=t;n++)printf a[s[n]]}' s
0       10      -       -       -
10000   -       10001   -       1
5.3400000000e+307     -       -       -       0
-       -10000  -       -       -
-       0       -       -       -
-       999     -       10      -
-       -       100     -       100
-       -       -       -       -

   

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
80 [报告]
发表于 2014-09-10 15:04 |只看该作者
回复 77# jason680

7         13         -        0
37         1         -        0

重排后:
   
    37         1         -        0
    37         13         -        0


不重排时为:
37         13         -        0
37         1         -        0


这要看具体需求了。

你的结果是重排了。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP