免费注册 查看新帖 |

Chinaunix

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

请问:awk: 对record排序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-08-27 17:43 |只看该作者 |倒序浏览
原文件
FO: 33
- jtag_tck_in__L9_N32
  ( jtag_tck_in__L9_I32 x ) ( bsm293_psc3_9/di_2dff ck )

FO: 38
- jtag_tck_in__L9_N7
  ( jtag_tck_in__L9_I7 x ) ( bsm044_eth_14/do_2dff ck )

。。。

想按照 FO 后的数据排序打印出来得到:
FO: 38
- jtag_tck_in__L9_N7
  ( jtag_tck_in__L9_I7 x ) ( bsm044_eth_14/do_2dff ck )
FO: 33
- jtag_tck_in__L9_N32
  ( jtag_tck_in__L9_I32 x ) ( bsm293_psc3_9/di_2dff ck )

我的程序如下:
BEGIN {
     2          RS = "FO: "
     3          FS = "\n"
     4          printf ("\n Generated at --- "
     5          system("date"
     6          printf (" \n\n";
     8          fanout_max = 0
     9          }
    12          {      
    13                  if($1 > fout_max ) fanout_max = $1
    14                  print $0 | "sort"
    15          }
    16  END {
    17        printf ("\n\nmax fanout net: %d\n",fanout_max)
    18      }
结果得到:
     1  
     2   Generated at --- Fri Aug 27 17:38:30 GMT 2004
     8  
     9    ( jtag_tck_in__L9_I32 x ) ( bsm293_psc3_9/di_2dff ck )
    10    ( jtag_tck_in__L9_I7 x ) ( bsm044_eth_14/do_2dff ck )
    11  - jtag_tck_in__L9_N32
    12  - jtag_tck_in__L9_N7
    13  33
    14  38
    15  
    16  
    17  max fanout net: 38

论坛徽章:
0
2 [报告]
发表于 2004-08-28 13:33 |只看该作者

请问:awk: 对record排序

可以用perl的hash来实现,不过awk或shell呢, 不需要先读出全部的数来排序再查找打印吧

论坛徽章:
0
3 [报告]
发表于 2004-08-28 13:50 |只看该作者

请问:awk: 对record排序

不懂你的意思

论坛徽章:
0
4 [报告]
发表于 2004-08-28 14:28 |只看该作者

请问:awk: 对record排序

[quote]原帖由 "gunguymadman"]不懂你的意思[/quote 发表:

me,too.

论坛徽章:
0
5 [报告]
发表于 2004-08-28 19:14 |只看该作者

请问:awk: 对record排序

BEGIN {
RS = "FO: "
FS = "\n"
}
{
   data[$1]=$0
}
END {
  for(i in data) print data
}


只能是从小到大进行排列

论坛徽章:
0
6 [报告]
发表于 2004-08-30 10:17 |只看该作者

请问:awk: 对record排序

但是,好像 “awk 在数组下标之间轮转时,它不会依照任何特定的顺序”。

论坛徽章:
0
7 [报告]
发表于 2004-08-30 11:21 |只看该作者

请问:awk: 对record排序

我的意思是
原文件:
FO:  38
aaaaa
FO:  32
bbbbbb
FO:  33
cccccc
希望得到
FO:  38
aaaaa
FO:  33
cccccc
FO:  32
bbbbbb

随风漂的好象如楼上所说起不到排序作用

论坛徽章:
0
8 [报告]
发表于 2004-08-30 11:48 |只看该作者

请问:awk: 对record排序

我的思路是这样:
1 首先判断该文件有多少条记录
2 将各条记录及记录中的第一个字段赋值
3 比较第一个字段的大小,输出记录

用awk求出文件记录数量的方法比较简单,假设我们已知有4条记录。
下面是将各记录赋值:
BEGIN {
……(记录分隔符省、字段分隔符标志省)
}
{
for(i=1;i<=4;i++)
{
   while(FNR==i)
   {
     text=$0
     first=$1
     print text
     print first
     break
   }
}
}
END{
#根据first大小的顺序来输出text(不过这段代码我怎么也写不出,谁来完善?
#那位是排序的高手,come on!
}

论坛徽章:
0
9 [报告]
发表于 2004-08-30 12:26 |只看该作者

请问:awk: 对record排序

用grep试试

  1. $cat file
  2. FO: 38
  3. aaaaa
  4. FO: 32
  5. bbbbbb
  6. FO: 33
  7. cccccc
  8. $cat f
  9. cat file|grep ^FO|sort -k2nr|while read i;do
  10.     cat file|grep -A1 "$i" #可以调整A1的值
  11. done

  12. $ksh f
  13. FO: 38
  14. aaaaa
  15. FO: 33
  16. cccccc
  17. FO: 32
  18. bbbbbb
复制代码

ps:就是效率差了些

论坛徽章:
0
10 [报告]
发表于 2004-08-30 12:59 |只看该作者

请问:awk: 对record排序


  1. BEGIN {
  2.         RS = "FO: "
  3.         FS = "\n"
  4.         fout_max = 0
  5. }
  6. {
  7.         data[$1]=$0
  8.         if($1 > fout_max ) fout_max = $1
  9. }
  10. END {
  11.         #for (i in data) print data[i]
  12.         for(i = fout_max; i > 0; i--)
  13.         #for(i = 1; i <= fout_max; i++)
  14.         {
  15.                 if(i in data) print data[i]
  16.                 #print i
  17.         }
  18. }
复制代码


在awk里没找到sort函数,没法象perl一样对key排序,于是我就想试试最愚笨的办法如以上code,
奇怪的是只有最大的data被print了,但的确是都遍历到了(pinrt i 打印出了max->1所有的数)
不解压不解

ps: bjgirl 的只能处理FO后面只有一行, 如过有多行就没发处理了,例如
FO: 33
aaaaaa
aaaaaa
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP