免费注册 查看新帖 |

Chinaunix

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

用awk处理有相同域的文件(排序并生成行号),请高手指教?具体如下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-16 17:42 |只看该作者 |倒序浏览
开始文件为
304.8           80              80              450              222           plated
558.8           80              80              700              19             plated
0                  80              80              850              1               non_plated
0                  80              80              1050            2               non_plated
1016            80              80              1150            29             plated
2540            80              80              2600            2               non_plated
2540            80              80              2700            4               plated
889              80              80              1050            2               plated
3048            80              80              3200            2               plated
3175            80              80              3250            2               non_plated
711.2           80              80              850              4               plated
4749.8         80              80              4800            4               non_plated
处理后文件为
1   A   304.8   80   80  450   222   plated         T1
2   B   558.8   80   80  700   19    plated          T2
3   C   0          80   80  850   1     non_plated   T3
4   D   711.2   80   80  850   4     plated           T3
5   E   0          80   80  1050  2     non_plated   T4
6   F   889      80   80  1050  2     plated           T4
7   G  1016     80   80  1150  29    plated         T5
8   H  2540     80   80  2600  2     non_plated  T6
9   I   2540     80   80  2700  4     plated          T7
10 J   3048     80   80  3200  2     plated          T8
11 K  3175     80   80  3250  4     non_plated   T9
12 j   4749.8  80   80  4800  4     non_plated    T10
用sort将文件1的第4列降序排列,用sed在每行前加行号,但是文件1有4行有相同域,不知怎样实现以上所示的效果?(加入一列字母排列,及在每行后加个T。例如第3行与第4行有相同域,后面都加上T3)

list3

1.05 KB, 下载次数: 49

list4

626 Bytes, 下载次数: 28

论坛徽章:
0
2 [报告]
发表于 2005-12-16 19:50 |只看该作者
没人回,自己顶一下。
wayy2008 该用户已被删除
3 [报告]
发表于 2005-12-16 22:23 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2005-12-16 22:44 |只看该作者
原帖由 skycity0210 于 2005-12-16 17:42 发表
开始文件为
304.8           80              80              450              222           plated
558.8           80              80              700              19             plated
0          ...


好难的题啊!

论坛徽章:
0
5 [报告]
发表于 2005-12-16 22:49 |只看该作者
对于附件list4(所要的效果)中
第3行与第4 行的第6列的值都是850,第5行与第6 行的第6列的值都是1050,因此后面加上去T数字
是相同的,即有12行但是T只有10个(两个T3与T4),不知是否表达清楚?
请老大们多多指教^_^

论坛徽章:
0
6 [报告]
发表于 2005-12-16 23:32 |只看该作者
12 j   4749.8  80   80  4800  4     non_plated    T10
这个j是L的笔误吗?
如果是,可以

  1. sort -n -k4 file|awk 'BEGIN{t=0}{if(++a[$4]==1)t++;printf("%d %c %s %s %s %s %s %s T%d\n",NR,64+NR,$1,$2,$3,$4,$5,$6,t)}'

复制代码

结果;
1 A 304.8 80 80 450 222 plated T1
2 B 558.8 80 80 700 19 plated T2
3 C 0 80 80 850 1 non_plated T3
4 D 711.2 80 80 850 4 plated T3
5 E 0 80 80 1050 2 non_plated T4
6 F 889 80 80 1050 2 plated T4
7 G 1016 80 80 1150 29 plated T5
8 H 2540 80 80 2600 2 non_plated T6
9 I 2540 80 80 2700 4 plated T7
10 J 3048 80 80 3200 2 plated T8
11 K 3175 80 80 3250 2 non_plated T9
12 L 4749.8 80 80 4800 4 non_plated T10

[ 本帖最后由 li2002 于 2005-12-16 23:45 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2005-12-16 23:51 |只看该作者
哇,老大厉害呀!谢谢了!(这个j是L的笔误)
老大能否大概说一下思路?awk的函数不太懂,非常感谢!!
"++a[$4]==1)t++"这一行主要是起什么作用?
是不是当第6列的值没有重复的才对t进行叠加?

[ 本帖最后由 skycity0210 于 2005-12-17 00:01 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2005-12-17 10:39 |只看该作者
是这个作用,当$4第一次出现时a[$4]自增后为1,t自增,当第二次出现时自增后不符合t自增的条件使t继续输出原值。

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
9 [报告]
发表于 2005-12-17 13:09 |只看该作者
超过26行,第二列会是什么字母?

论坛徽章:
0
10 [报告]
发表于 2005-12-17 14:27 |只看该作者
原帖由 skycity0210 于 2005-12-16 23:51 发表
哇,老大厉害呀!谢谢了!(这个j是L的笔误)
老大能否大概说一下思路?awk的函数不太懂,非常感谢!!
"++a[$4]==1)t++"这一行主要是起什么作用?
是不是当第6列的值没有重复的才对t进行叠加?

是当有新的第6列的值才对t进行叠加。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP