免费注册 查看新帖 |

Chinaunix

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

[文本处理] 按列倒序排列 [复制链接]

论坛徽章:
11
CU十二周年纪念徽章
日期:2013-10-24 15:41:342015年辞旧岁徽章
日期:2015-03-03 16:54:15丑牛
日期:2015-01-14 10:36:40技术图书徽章
日期:2015-01-12 15:46:11白羊座
日期:2014-11-14 09:35:36狮子座
日期:2014-10-30 13:18:49巳蛇
日期:2014-10-11 12:52:08子鼠
日期:2014-09-28 14:11:06双鱼座
日期:2014-04-22 13:05:48午马
日期:2014-02-11 17:58:002015年迎新春徽章
日期:2015-03-04 09:55:28
31 [报告]
发表于 2013-04-18 14:54 |只看该作者
现在功力未到,只能看看先,还不懂其中的很多写法意思!

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
32 [报告]
发表于 2013-04-18 15:21 |只看该作者
回复 29# yestreenstars


    这不是说“最好”嘛。再说了,你这限制awk不把人的思维给限制住啦。当然啦,从效率以及适合度来说,awk应该是首选。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
33 [报告]
发表于 2013-04-18 15:23 |只看该作者
回复 30# cjaizss


    嗯,awk看起来已经万能了。其它的小工具只是特定功能。对于简单功能自然使用特定工具来得简单,不过复杂一些的功能要搭配小工具,各种管道倒来倒去,效率好不了。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
34 [报告]
发表于 2013-04-18 16:28 |只看该作者
回复 22# ly5066113


    这个思路有点难以理解,我稍微改动了一下(精简):
  1. awk -F\| '{for(i=1;i<=NF;i++){for(j=1;j<NR;j++)if($i>a[i,j])break;for(k=NR;k>j;k--)a[i,k]=a[i,(k-1)];a[i,j]=$i}}END{for(i=1;i<=NR;i++){for(j=1;j<NF;j++)printf a[j,i]"|";print a[j,i]}}'
复制代码

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
35 [报告]
发表于 2013-04-18 17:11 |只看该作者
awk真的太强大了,学习了~

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
36 [报告]
发表于 2013-04-23 17:23 |只看该作者
回复 22# ly5066113


Tim大师能解释下吗?有点不理解。



   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
37 [报告]
发表于 2013-04-23 18:03 |只看该作者
回复 36# wenhq


简单点说,就是把所有数据都记录到数组中,用 1,1  2,3 这样的字串当数组的下标,来记录位置。
每读一行记录,循环每一个数字,找到该数字在数组中所在那一列的位置(数组中第一个比它小的元素的位置),记录位置,下面的所有数字依次向下移位,然后把这个数字插入到这个位置,如果没有找到,就插入到最后面。

以第一列为例:
第一行: a[1,1]=85
第二行:12 比 所有元素都小,找不到位置,所以插入最后 a[1,1]=85  a[1,2]=12
第二行:04 比 所有元素都小,找不到位置,所以插入最后 a[1,1]=85  a[1,2]=12  a[1,3]=04

以第二列为例:
第一行: a[2,1]=44
第二行:52 比 44大,44及后面的所有元素向下移位 a[2,2]=44 ,52插入到原44的位置 a[2,1]=52
第三行:85 比 52大,52及后面的所有元素向下移位 a[2,2]=52  a[2,3]=44 ,85插入到原52的位置 a[2,1]=85

以此类推。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
38 [报告]
发表于 2013-04-24 09:40 |只看该作者
回复 37# ly5066113

那a[1,1]=85 是在什么部分体现的呢?怎么得出来的呢?

思路我大体上明白了。就是到 if( $i>a[i",“j] )  这里卡住了,因为a[i","j]没初始化? 或者说初始化了,在那里体现了?

   

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
39 [报告]
发表于 2013-04-24 10:29 |只看该作者
本帖最后由 ly5066113 于 2013-04-24 10:29 编辑

回复 38# wenhq


仔细看循环的条件,第一行时 for(j=1;j<NR;j++) 和 for(k=NR;k>j;k--) 循环里面是都不会执行的

直接执行 a[i","j]=$i

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
40 [报告]
发表于 2013-04-24 10:34 |只看该作者
回复 39# ly5066113
看到了谢谢Tim大师。

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP