免费注册 查看新帖 |

Chinaunix

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

awk怎么处理无序的域 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-25 12:02 |只看该作者 |倒序浏览
比如像cygwin的setup.ini或debian的索引文件(packages)

论坛徽章:
0
2 [报告]
发表于 2008-09-25 12:21 |只看该作者
awk不讲究排序的吧?

论坛徽章:
0
3 [报告]
发表于 2008-09-25 12:23 |只看该作者
参考
这段代码用来计算cygwin下某个模块的安装包的依赖关系

  1. #! /usr/bin/gawk -f
  2. #
  3. #        gawk -v PACKAGES_TO_INSTALL="gdb" \
  4. #                -f \$get-cygwin-requries.awk setup.ini

  5. function make_key(package, suffix)
  6. {
  7.         return package DS suffix;
  8. }

  9. function compare(requires1, requires2, a1,n1,a2,n2,i)
  10. {
  11.         n1 = split(requires1, a1);
  12.         n2 = split(requires2, a2);
  13.         if( n1 == n2 ) {
  14.                 asort(a1);
  15.                 asort(a2);
  16.                 for(i=1; i<=n1; i++) {
  17. #                        printf("%s -- %s\n", a1[i], a2[i]) >STDERR;
  18.                         if(a1[i] != a2[i])
  19.                                 return -1;
  20.                 }
  21.                 return 0;
  22.         }
  23.         return n1-n2;
  24. }

  25. function in_array(val, array, i)
  26. {
  27.         for(i in array) {
  28.                 if( array[i] == val ) {
  29. #                        printf("IN\n") >STDERR;
  30.                         return 1;
  31.                 }
  32.         }
  33. #        printf("OUT\n") >STDERR;;
  34.         return 0;
  35. }

  36. function join(requires1, requires2,
  37.         a1,n1,a2,n2,i,r)
  38. {
  39.         n1 = split(requires1, a1);
  40.         n2 = split(requires2, a2);
  41.         r = "";
  42.        
  43.         for(i=1; i<=n1; i++)
  44.                 r = r " " a1[i];
  45.         for(i=1; i<=n2; i++) {
  46.                 if( !in_array(a2[i], a1) ) {
  47.                         r = r " " a2[i];
  48.                 }
  49.         }
  50.         return r;
  51. }


  52. function get_requires(all_packages, requires,
  53.         max_requires, more_requires, req, i, n, key_requires, package)
  54. {
  55.         max_requires = requires;
  56. #        printf("Enter: Level: %d\n", level) >STDERR;
  57. #        printf("requries: %s\n", requires) >STDERR;
  58.         n = split(requires, req);
  59.         for(i=1; i<=n; i++) {
  60.                 package = req[i];
  61.                 key_requires = make_key(package, "requires");
  62. #                printf("key: %s\n", key_requires) >STDERR;
  63.                 more_requires = all_packages[key_requires];
  64. #                printf("more_requries: %s\n", more_requires) >STDERR;
  65.                 max_requires = join(max_requires,  more_requires);
  66.         }
  67. #        printf("requires:     %s\n", requires) >STDERR;
  68. #        printf("max_requires: %s\n", max_requires) >STDERR;
  69.         if( compare(max_requires, requires) != 0 ) {
  70.                 more_requires = get_requires(all_packages, max_requires);
  71.                 max_requires = join(max_requires, more_requires);
  72.         }
  73. #        printf("Leave: Level: %d\n", level) >STDERR;
  74.         return max_requires;
  75. }


  76. function resolve_packages(all_packages, packages,
  77.         a, n, i, key, files)
  78. {
  79.         files = "";
  80.         n = split(packages, a);
  81.         for(i=1; i<=n; i++) {
  82.                 key = make_key(a[i], "install");
  83.                 if( all_packages[key] != "" )
  84.                         files = files " " all_packages[key];
  85.         }
  86.         return files;
  87. }


  88. BEGIN {
  89.         FS = "(:|[ \t]+)";
  90. #        STDERR = "/dev/stderr";
  91.         STDERR = "/dev/null";
  92.         skip_prev = 1;
  93.         DS = "#";
  94. }


  95. {
  96.         delete words
  97.         num_words = 0;
  98.         for(i=1; i<=NF; i++) {
  99.                 if($i != "") {
  100.                         num_words++;
  101.                         words[num_words] = $i;
  102. #                        printf("%s--", $i) >STDERR;
  103.                 }
  104.         }
  105. #        printf("\n") >STDERR;
  106.        
  107.         switch(words[1]) {
  108.         case "@":
  109.                 skip_prev = 0;
  110.                 cur_package = words[2];
  111.                 printf("@ %s\n", cur_package) >STDERR;
  112.                 break;

  113.         case "requires":
  114.                 if(!skip_prev) {
  115.                         key = make_key(cur_package, "requires");
  116.                         requires = "";
  117.                         for(i=2; i<=num_words; i++)
  118.                                 requires = requires " " words[i];
  119.                         all_packages[key] = requires;
  120.                         printf("requires: %s\n", requires) >STDERR;
  121.                 }
  122.                 break;

  123.         case "install":
  124.                 if(!skip_prev) {
  125.                         key = make_key(cur_package, "install");
  126.                         all_packages[key] = words[2];
  127.                         printf("install: %s\n", words[2]) >STDERR;
  128.                 }
  129.                 break;

  130.         case "[prev]":
  131.                 skip_prev = 1; break;
  132.         }
  133. }

  134. END {
  135.         pkg = get_requires(all_packages, PACKAGES_TO_INSTALL);
  136.         printf("%s\n", pkg );
  137.         printf("%s\n", resolve_packages(all_packages,pkg) );
  138. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2008-09-26 01:27 |只看该作者
怎么个无序法,需要怎么个处理法?

论坛徽章:
0
5 [报告]
发表于 2008-09-26 08:49 |只看该作者
谢谢 prc 大概看明白了,就是函数有点晕,如果要用RS\FS来解析的话怎么写,下面是我写的用来解析packages的,不过每个域的第一个字母会没掉
{
RS=""
FS="\n[^ ]"
}

@xwmhmily 下面一cygwin的setup.ini里的两条数据.第一个域(@ ELFIO)是固定有的,而下面的requires\install等却是不一定有的,但是并不给它们留位置

--------------------------------------------------------
@ ELFIO
sdesc: "ELF file reader and producer implemented as a C++ library"
ldesc: "ELFIO is a C++ library for reading and generating files in the
ELF (Executable and Linkable Format) binary format. This library is
unique and not based on any other product. It is also platform
independent. The library uses standard ANSI C++ constructions and runs
on a wide variety of architectures."
category: Devel System Libs Utils
requires: cygwin
version: 1.0.2-1
install: release/ELFIO/ELFIO-1.0.2-1.tar.bz2 159970 41b32111cbaaad78ea56dc62b757dd46
source: release/ELFIO/ELFIO-1.0.2-1-src.tar.bz2 280550 891cb420a38144e94447e99e3fddafa2
[prev]
version: 1.0.0-1
install: release/ELFIO/ELFIO-1.0.0-1.tar.bz2 151514 47cf28298685439ba5b5ac478e8eb44e
source: release/ELFIO/ELFIO-1.0.0-1-src.tar.bz2 274022 d29ab8fb0cad01250969983afca9891b

@ GConf2-doc
sdesc: "GNOME configuration database system (API documentation)"
ldesc: "GConf is a configuration database system, functionally similar to the
Windows registry but lots better. It's being written for the GNOME
desktop but does not require GNOME; configure should notice if GNOME
is not installed and compile the basic GConf library anyway."
category: Gnome Doc
version: 2.14.0-2
install: release/GNOME/GConf2/GConf2-doc/GConf2-doc-2.14.0-2.tar.bz2 42867 0917edf071036bd8be29fec5dec17930
source: release/GNOME/GConf2/GConf2-2.14.0-2-src.tar.bz2 1909270 578ce94b6bdb2ce9a49dd7c90ede47ea
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP