Chinaunix

标题: 用awk处理有相同域的文件(排序并生成行号),请高手指教?具体如下 [打印本页]

作者: skycity0210    时间: 2005-12-16 17:42
标题: 用awk处理有相同域的文件(排序并生成行号),请高手指教?具体如下
开始文件为
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


作者: skycity0210    时间: 2005-12-16 19:50
没人回,自己顶一下。
作者: wayy2008    时间: 2005-12-16 22:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: dbcat    时间: 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          ...


好难的题啊!
作者: skycity0210    时间: 2005-12-16 22:49
对于附件list4(所要的效果)中
第3行与第4 行的第6列的值都是850,第5行与第6 行的第6列的值都是1050,因此后面加上去T数字
是相同的,即有12行但是T只有10个(两个T3与T4),不知是否表达清楚?
请老大们多多指教^_^
作者: li2002    时间: 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 编辑 ]
作者: skycity0210    时间: 2005-12-16 23:51
哇,老大厉害呀!谢谢了!(这个j是L的笔误)
老大能否大概说一下思路?awk的函数不太懂,非常感谢!!
"++a[$4]==1)t++"这一行主要是起什么作用?
是不是当第6列的值没有重复的才对t进行叠加?

[ 本帖最后由 skycity0210 于 2005-12-17 00:01 编辑 ]
作者: li2002    时间: 2005-12-17 10:39
是这个作用,当$4第一次出现时a[$4]自增后为1,t自增,当第二次出现时自增后不符合t自增的条件使t继续输出原值。
作者: r2007    时间: 2005-12-17 13:09
超过26行,第二列会是什么字母?
作者: HeavenTear    时间: 2005-12-17 14:27
原帖由 skycity0210 于 2005-12-16 23:51 发表
哇,老大厉害呀!谢谢了!(这个j是L的笔误)
老大能否大概说一下思路?awk的函数不太懂,非常感谢!!
"++a[$4]==1)t++"这一行主要是起什么作用?
是不是当第6列的值没有重复的才对t进行叠加?

是当有新的第6列的值才对t进行叠加。。
作者: zhl1979    时间: 2005-12-17 21:33
好题
看看谁用的时间最短

作者: skycity0210    时间: 2005-12-17 22:10
26行这后出现了“[" "\"这类键盘的符号
”64+NR“起什么作用?
作者: li2002    时间: 2005-12-18 11:13
原帖由 skycity0210 于 2005-12-17 22:10 发表
26行这后出现了“[" "\"这类键盘的符号
”64+NR“起什么作用?

你没有确定超过26行后是什么方式显示,所有。。。只能暂时这样写。




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