免费注册 查看新帖 |

Chinaunix

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

【求助】实现复杂一点的comm功能 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-11-25 13:31 |只看该作者
又仔细看了一下楼主的说明,确实如Tim所说,是需要排序的,而且两文件应该不是行行对应的关系
写了个脚本,能实现功能,但效率可能不高
  1. #!/bin/bash
  2. file1=file1
  3. file2=file2
  4. #生成排序表
  5. awk '{a[$1" "$2]++;b[$1" "$2" "FILENAME]}END{for (i in a) if (a[i]==1) {for (j in b) if (j~"^"i" ") {print j;break}}else print i}' $file1 $file2 | sort -k1,1 -k2,2n >order
  6. while read line
  7. do
  8.   echo $line | awk -v f1="$file1" -v f2="$file2" '$3==f1{f="F1"}$3==f2{f="F2"}$3{while (getline v< $3) if (v~"^"$1" +"$2" +") {print f,v;exit}next}{while (getline v <f1) if (v~"^"$1" +"$2" +") {printf "F1 "v"\t";break}while (getline v <f2) if (v~"^"$1" +"$2" +") {print "F2",v;exit}}'
  9. done<order
复制代码


测试用数据如下
  1. [root@Mylinux tmp]# cat file1
  2. A  4  name3-1  name9-1
  3. A  5  name7-1  name6-1
  4. A  6  name7-1  name6-1
  5. A  7  name7-1  name6-1
  6. B  1  name1-1  name2-1
  7. B  4  name3-1  name9-1
  8. B  5  name7-1  name6-1
  9. B  6  name7-1  name6-1
  10. B  7  name7-1  name6-1
  11. C  3  name7-1  name6-1
  12. [root@Mylinux tmp]# cat file2
  13. A  1  name1-2  name2-2
  14. A  3  name3-2  name9-2
  15. A  5  name7-2  name6-2
  16. B  1  name1-2  name2-2
  17. B  3  name3-2  name9-2
  18. B  5  name7-2  name6-2
  19. C  5  name7-2  name6-2
  20. D  1  name7-2  name6-2
复制代码


最后结果
  1. [root@Mylinux tmp]# ./mysh
  2. F2 A  1  name1-2  name2-2
  3. F2 A  3  name3-2  name9-2
  4. F1 A  4  name3-1  name9-1
  5. F1 A  5  name7-1  name6-1       F2 A  5  name7-2  name6-2
  6. F1 A  6  name7-1  name6-1
  7. F1 A  7  name7-1  name6-1
  8. F1 B  1  name1-1  name2-1       F2 B  1  name1-2  name2-2
  9. F2 B  3  name3-2  name9-2
  10. F1 B  4  name3-1  name9-1
  11. F1 B  5  name7-1  name6-1       F2 B  5  name7-2  name6-2
  12. F1 B  6  name7-1  name6-1
  13. F1 B  7  name7-1  name6-1
  14. F1 C  3  name7-1  name6-1
  15. F2 C  5  name7-2  name6-2
  16. F2 D  1  name7-2  name6-2
复制代码

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
12 [报告]
发表于 2009-11-25 14:33 |只看该作者

回复 #11 ywlscpl 的帖子

重新排序有些浪费了,file1 file2 都是排好序的。
只用awk也是可以做的:

  1. $ awk -f test.awk file1
  2. F2 A  1  name1-2  name2-2
  3. F2 A  3  name3-2  name9-2
  4. F1 A  4  name3-1  name9-1
  5. F1 A  5  name7-1  name6-1 F2 A  5  name7-2  name6-2
  6. F1 A  6  name7-1  name6-1
  7. F1 A  7  name7-1  name6-1
  8. F1 B  1  name1-1  name2-1 F2 B  1  name1-2  name2-2
  9. F2 B  3  name3-2  name9-2
  10. F1 B  4  name3-1  name9-1
  11. F1 B  5  name7-1  name6-1 F2 B  5  name7-2  name6-2
  12. F1 B  6  name7-1  name6-1
  13. F1 B  7  name7-1  name6-1
  14. F1 C  3  name7-1  name6-1
  15. F2 C  5  name7-2  name6-2
  16. F2 D  1  name7-2  name6-2
  17. $ cat test.awk
  18. #! /usr/bin/awk -f

  19. {
  20.         getline var <"file2"
  21.         split(var ,a ,/[[:blank:]]+/)
  22.         while(1)
  23.         {
  24.                 if($1 == a[1] && $2 == a[2])
  25.                 {
  26.                         print "F1 "$0" F2 "var
  27.                         next
  28.                 }
  29.                 else
  30.                 {
  31.                         if(($1 == a[1] && $2 < a[2]) || $1 < a[1])
  32.                         {
  33.                                 print "F1 "$0
  34.                                 if(!(getline))
  35.                                 {
  36.                                         do
  37.                                         {
  38.                                                 print "F2 "var
  39.                                         }
  40.                                         while(getline var <"file2")
  41.                                         exit
  42.                                 }
  43.                         }
  44.                         else
  45.                         {
  46.                                 print "F2 "var
  47.                                 if(getline var <"file2")
  48.                                 {
  49.                                         split(var ,a ,/[[:blank:]]+/)
  50.                                 }
  51.                                 else
  52.                                 {
  53.                                         do
  54.                                         {
  55.                                                 print "F1 "$0
  56.                                         }
  57.                                         while(getline)
  58.                                         exit
  59.                                 }
  60.                         }
  61.                 }
  62.         }
  63. }
复制代码

[ 本帖最后由 ly5066113 于 2009-11-25 14:34 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2009-11-25 14:36 |只看该作者
原帖由 ywlscpl 于 2009-11-24 14:44 发表
awk 'NR==FNR{a[$1" "$2]=$0}NR>FNR{b[$1" "$2]=$0}END{for (i in a) print "F1",a(i in b?"\tF2 "b:"");for (i in b) if (!(i in a)) print "F2",b}' file1 file2  


这个命令可以实现合并,但是合并后顺序就乱掉了,如果加个sort,倒是恢复了原来的顺序。

awk 'NR==FNR{a[$1" "$2]=$0}NR>FNR{b[$1" "$2]=$0}END{for (i in a) print "F1",a(i in b?"\tF2 "b:"");for (i in b) if (!(i in a)) print "F2",b}' file1 file2 | sort -k1,1 -k2,2n >order

重排序是想全力避免的,文件太大,几百G,如果重新排序,太浪费资源

[ 本帖最后由 wanggd1983 于 2009-11-25 14:41 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2009-11-25 14:46 |只看该作者
原帖由 ly5066113 于 2009-11-25 14:33 发表
重新排序有些浪费了,file1 file2 都是排好序的。
只用awk也是可以做的:

$ awk -f test.awk file1
F2 A  1  name1-2  name2-2
F2 A  3  name3-2  name9-2
F1 A  4  name3-1  name9-1
F1 A  5  name7-1 ...


没有看懂,直接运行也出错,如下:
line 5: syntax error near unexpected token `var'
line 5: `        split(var ,a ,/[[:blank:]]+/)'

还望大虾赐教:)

论坛徽章:
0
15 [报告]
发表于 2009-11-25 14:58 |只看该作者

回复 #12 ly5066113 的帖子

学习了

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
16 [报告]
发表于 2009-11-25 15:04 |只看该作者

回复 #14 wanggd1983 的帖子

如何运行的?

论坛徽章:
0
17 [报告]
发表于 2009-11-25 15:59 |只看该作者
原帖由 ly5066113 于 2009-11-25 15:04 发表
如何运行的?


贴到一个脚本里,然后qsub

额,是不是有问题?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP