免费注册 查看新帖 |

Chinaunix

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

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

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

请问:awk: 对record排序

原帖由 "jorsa" 发表:

ps: bjgirl 的只能处理FO后面只有一行, 如过有多行就没发处理了,例如
FO: 33
aaaaaa
aaaaaa

没说清楚,这个后面跟的行数是不一定的,而且每个FO后的都不一样,和 FO的这个数有一些关系, 所以bjgirl的这个Ax不好写

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

请问:awk: 对record排序

bjgirl的能处理多行。
先看看man grep ^_^
若要看2行,把 “A1”换成“A2”,依次类推。

只能显示一行,是因为语句:
if($1 > fout_max ) fout_max = $1
不断的把较小值替换成较大值了。

我感觉用awk排序很复杂!其对循环比较的功能不像c语言方便。

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

请问:awk: 对record排序

不对不对
1。首先这个print data是在END里,fout_max已经是最大直且不会变了
2。我是指若每个记录的行数不一定,这个Ax 就不好写,若是都一样当然好办了

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

请问:awk: 对record排序

应该是BEGIN中的问题,因为若是普通文件:
$ cat text
38 aaaaa
32 bbbbbb
40 cccccc
22 ddddd
11 eeeeee
99 bbbbbbbbbbbbbbbbbbb

将你的稍作修改:
$ cat awknum
BEGIN{
  fout_max=0
}
{
for(j=1;j<=6;j++)
{
  while(FNR==j)
  {
   data[$1]=$0
   if($1>fout_max)
     {fout_max=$1}
   break
  }
}
}
END{
for(i=fout_max;i>0;i--)
  {
     if(i in data)
     print data
  }
}

$ awk -f awknum text
99 bbbbbbbbbbbbbbbbbbb
40 cccccc
38 aaaaa
32 bbbbbb
22 ddddd
11 eeeeee

这个又完全正常。

以下的就失常:
$ cat text
FO: 38
aaaaa

FO: 32
bbbbbb

FO: 40
cccccc

FO: 22
ddddd

FO: 11
eeeeee

FO: 99
bbbbbbbbbbbbbbbbbbb

$ cat awknum
BEGIN{
  NS="FO: "
  RS="\n"
  fout_max=0
}
{
for(j=1;j<=6;j++)
{
  while(FNR==j)
  {
   data[$1]=$0
   if($1>fout_max)
     {fout_max=$1}
   break
  }
}
}
END{
for(i=fout_max;i>0;i--)
  {
     if(i in data)
     print data
  }
}

$ awk -f awknum text
bbbbbb

点解?

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

请问:awk: 对record排序

感觉上的确和BEGIN里FS = "\n"有关,原因不明

不过好在我最终的code用不上它,大家看看还有没改进的地方,code如下

  1. BEGIN {
  2.         RS = ";"
  3.         FS = ")"
  4.         printf ("\n Generated at --- ")
  5.         system("date")
  6.         printf (" \n\n");
  7.         }

  8.         {if($0 !~ /USE CLOCK/) next}
  9.        
  10.         {
  11.                 new = 0
  12.                 for ( x = 1; x <= NF; x++)
  13.                         if($x ~/(NEW m|+ ROUTED m|\* )/)#if($x ~/00/)
  14.                                 new = new + 1
  15.                 tmp_fout = NF - new - 2
  16.                 if(tmp_fout > 30) {
  17.                         out = ""
  18.                         for(x = 1 ; x < NF -new; x ++)
  19.                                 out = sprintf("%s%s)",out, $x) #out + $i
  20.                         #printf ("\n\nFO: %d %s", NF-new-2, out)
  21.                         if(tmp_fout in fanout)
  22.                                 fanout[tmp_fout] = sprintf("FO: %d %s \n\n%s", tmp_fout, out,fanout[tmp_fout])
  23.                         else
  24.                                 fanout[tmp_fout] = sprintf("FO: %d %s\n", tmp_fout, out)
  25.                         if(tmp_fout  > fout_max )
  26.                                 fout_max = tmp_fout
  27.                 }
  28.         }
  29. END {
  30.         printf ("\n\nmax fanout on clock net: %d\n\n", fout_max)
  31.         for(i = fout_max; i > 0; i--)
  32.                 if (i in fanout) print fanout[i]
  33.         }
复制代码

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

请问:awk: 对record排序

for i in `nawk  -F":" '{print $2|"sort -r"}'  filename`
do
       nawk '/FO\:'"$i"'/{ print
                for(i =1; i < 2; i++){
                        getline; print }
}'  filename
done
#如果你要打印FO下三行,把i < 2 改为i < 4 就可以了。

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

请问:awk: 对record排序

楼上的,若是FO下面有的是三行,有的是两行,怎么办?

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

请问:awk: 对record排序

[quote]原帖由 "shaoping0330"]楼上的,若是FO下面有的是三行,有的是两行,怎么办?[/quote 发表:

不知道

论坛徽章:
0
19 [报告]
发表于 2004-08-30 18:05 |只看该作者

请问:awk: 对record排序

原帖由 "shaoping0330"]楼上的,若是FO下面有的是三行,有的是两行,怎么办?[/quote 发表:

实验了一下,请您指教一下
[quote]$cat file
FO: 38
aaaaa
dfsdfsdf
FO: 32
bbbbbb
sf
f
234234
FO: 33
cccccc
fsdfsdf
FO: 35
aaaaa
dfsdf
sdfsdf
sdfsdfs
sdf
sdf
sdf
sdf
sd
FO: 36
bbbbbb
FO: 37
cccccc

  1. tr '\n' ' ' <file|sed 's/FO/\n&/g'|sort -k2nr|awk '{print $1,$2}{for(i=3;i<=NF;i++)print $i}'
复制代码
FO: 38
aaaaa
dfsdfsdf
FO: 37
cccccc
FO: 36
bbbbbb
FO: 35
aaaaa
dfsdf
sdfsdf
sdfsdfs
sdf
sdf
sdf
sdf
sd
FO: 33
cccccc
fsdfsdf
FO: 32
bbbbbb
sf
f
234234

论坛徽章:
0
20 [报告]
发表于 2004-08-30 18:19 |只看该作者

请问:awk: 对record排序

^_^ bjgirl好聪明!
多行按照你的方法的确能处理。

不过,我其实是想问begincwcw:
……
for(i =1; i < 2; i++){
getline; print }
……
他的程序怎样能识别多行。

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP