免费注册 查看新帖 |

Chinaunix

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

跨文件比对关键字 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-20 21:01 |只看该作者 |倒序浏览
本帖最后由 怿_mao44 于 2012-06-03 12:44 编辑

解决。。

当两个不同文件中(输入文件一,第二列与输入文件二,第三列)存在关键字需要匹配,且按此合并匹配成功的记录时,如何匹配
  1. 输入文件一:
  2. 1        aa        123
  3. 2        aa        234
  4. 3        bb        345
  5. 4        bb        445
  6. 5        dd        234
复制代码
  1. 输入文件二:
  2. A1        111        aa
  3. B1        222        bb
  4. B2        333        bb
  5. B2        333        cc
复制代码
根据输入文件一中第2列,输入文件二中第3列作为关键字进行匹配,输出全部匹配的记录
期望输出结果:
  1. 1        aa        123        A1        111        aa
  2. 2        aa        234        A1        111        aa
  3. 3        bb        345        B1        222        bb
  4. 4        bb        445        B1        222        bb
  5. 3        bb        345        B2        333        bb
  6. 4        bb        445        B2        333        bb
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
2 [报告]
发表于 2012-05-21 08:30 |只看该作者
如果关键字存在于文件一,但是不存在于文件二,或者在文件二,但不在文件一,是否要处理,什么输出格式?

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
3 [报告]
发表于 2012-05-21 08:40 |只看该作者
本帖最后由 rdcwayx 于 2012-05-21 08:43 编辑

还有,关键字在每个文件里都有重复,这个如何处理,什么输出格式?

比如下面的文件,你需要什么样的输出。 还有,你这个是实际需求吗,还是只是用来写代码练练手的?
  1. 输入文件一:
  2. 1        aa        123
  3. 2        aa        234
  4. 3        bb        345
  5. 4        bb        445
  6. 5        dd        234
复制代码
  1. 输入文件二:
  2. A1        111        aa
  3. B1        222        bb
  4. B2        333        bb
  5. B2        333        cc
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-05-21 09:51 |只看该作者
回复 3# rdcwayx


    前面的情况不用考虑,自己能解决。。

只是关键字在两个输入文件中,都重复的情况,不知道怎么办,总是会有缺失,只能输出部分的结果。。

   主楼上写的只是简化过练习的示例输入输出文件,
示例说明
    在输入文件一中,关键字为第二列,"aa"即出现了重复
输入文件一:
  1. 1        aa        123
  2. 2        aa        234
  3. 3        bb        345
复制代码
在输入文件二中,关键字为第三列,"bb"也出现了重复
输入文件二:
  1. A1        111        aa
  2. B1        222        bb
  3. B2        333        bb
复制代码
希望输出的结果中,包含了在输入文件中全部重复的情况,并按照关键字相同的内容合并两个输入文件中的行为同一行
期望的结果文件:
  1. 1        aa        123        A1        111        aa
  2. 2        aa        234        A1        111        aa
  3. 3        bb        345        B1        222        bb
  4. 3        bb        345        B2        333        bb
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
5 [报告]
发表于 2012-05-21 09:54 |只看该作者
如果 bb 在file1 有重复,在file2也有重复, 比如我给的例子里,你想要什么样的输出?

论坛徽章:
0
6 [报告]
发表于 2012-05-21 10:03 |只看该作者
回复 5# rdcwayx


根据你的示例文件得到的结果如下
     输入文件一中的“dd”,和输入文件二中的“cc”因为没有匹配的所以不输出
  1. 1        aa        123        A1        111        aa
  2. 2        aa        234        A1        111        aa
  3. 3        bb        345        B1        222        bb
  4. 4        bb        445        B1        222        bb
  5. 3        bb        345        B2        333        bb
  6. 4        bb        445        B2        333        bb
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
7 [报告]
发表于 2012-05-21 10:15 |只看该作者
本帖最后由 rdcwayx 于 2012-05-21 10:16 编辑
  1. awk 'NR==FNR{key[$2]++;a[$2 FS key[$2]]=$0;next}
  2.     $3 in key {for (i=1;i<=key[$3];i++) print a[$3 FS i], $0}' OFS="\t" file1 file2
复制代码

论坛徽章:
0
8 [报告]
发表于 2012-05-21 10:29 |只看该作者
回复 7# rdcwayx


    能问一下代码中key的作用么  

感觉似乎是它在影响,但是查找 awk 或者 shell key 却没有什么相关介绍,不知道是用的什么点。。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
9 [报告]
发表于 2012-05-21 10:38 |只看该作者
本帖最后由 rdcwayx 于 2012-05-21 10:42 编辑
怿_mao44 发表于 2012-05-21 10:29
回复 7# rdcwayx
   能问一下代码中key的作用么   
感觉似乎是它在影响,但是查找 awk 或者 shell key 却没有什么相关介绍,不知道是用的什么点。。

awk里的变量,数组名可以任意定义,用key只是方便阅读理解。写成下面这样的,写得很隐晦,但是看起来只是不太容易帮助理解。
  1. awk 'NR==FNR{_[$2]++;a[$2 FS _[$2]]=$0;next}
  2.     $3 in _ {for (i=1;i<=_[$3];i++) print a[$3 FS i], $0}' OFS="\t" file1 file2
复制代码

论坛徽章:
0
10 [报告]
发表于 2012-05-23 18:43 |只看该作者
回复 9# rdcwayx


       今天直接上数据测试,发现没有任何结果输出,不知道出现什么问题的了
  1. $ grep aa_001080395 file1.txt
  2. AATK    aa_001080395    17   79091095        79139872        1155    1414    0.2512  687     841     0.2533

  3. $ grep aa_001080395 file2.txt
  4. 1250    AATK    aa_001080395
  5. 3065    AATK    aa_001080395
  6. 338     AATK    aa_001080395
复制代码
随意抽取的一例,确实在两个文件中都存在记录

但是匹配输出记录为空值
  1. $ awk 'NR==FNR{key[$2]++;a[$2 FS key[$2]]=$0;next}
  2. $3 in key {for (i=1;i<=key[$3];i++) print a[$3 FS i], $0}' OFS="\t" file1.txt file2.txt |wc -l
  3. 0
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP