免费注册 查看新帖 |

Chinaunix

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

[文本处理] 根据相同列查找某一行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-19 11:27 |只看该作者 |倒序浏览
file1,csv文件
fam1,chr1,16950470,0.833266667007005
fam1,chr1,76190271,0.684558404931228
fam1,chr1,103427994,0.48393638491905
fam1,chr1,111863039,0.980521031104692
file2,vcf文件,\t分隔
chr1    16877405        .       G       A         ...   
chr1    16910063        rs3872319       C       T          ...
chr1    16950470        rs12144467      C       T       ...

如果file1的第三列在file2的第二列存在,就输出file2的一整行。
比如16950470在file2里存在,就输出chr1    16950470        rs12144467      C       T       ...


我写的代码是awk 'NR==FNR{FS=","}{a[$3]=0}NR>FNR{FS="\t"}{if ($2 in a){print $0}}'  file1 file2

可是我的结果中总是会把第一个结果忽略,但是会输出file1的那一行,如下所示:
fam1,chr1,15518588,0.913004409459763
chr1    16950470        rs12144467      C       T       ...
chr1    76190271        .       C       T      ...
chr1    103427994       rs4353117       A       T      ...

哪位亲能帮忙解释一下?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
2 [报告]
发表于 2014-08-19 11:47 |只看该作者
本帖最后由 这个冬天不冷 于 2014-08-19 11:49 编辑

awk 'NR==FNR{FS=","}{a[$3]=$0;}NR>FNR{{FS="\t"}{if ($2 in a){print $0}}}'  file1 file2   NR>FNR 是整个后半句代码的 判断条件

论坛徽章:
0
3 [报告]
发表于 2014-08-19 11:53 |只看该作者
回复 2# 这个冬天不冷
我试了,这样的话第一行直接没有了,既没有file1的结果,也没有file2的结果

   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
4 [报告]
发表于 2014-08-19 12:25 |只看该作者
回复 3# 明瞳狐狸
awk 'NR==FNR{FS=","}{a[$3]=0}NR>FNR{FS="\t"}{if ($2 in a){print $0}}'  file1 file2
你从头到尾读一遍 ,你就发现
NR==FNR{FS=","}
{a[$3]=0}
NR>FNR{FS="\t"}
{if ($2 in a){print $0}}

它是这样执行的

逻辑肯定不对的

另外思路是对的

论坛徽章:
5
白羊座
日期:2014-10-28 11:23:27水瓶座
日期:2015-01-20 10:19:022015亚冠之柏斯波利斯
日期:2015-07-11 18:17:2015-16赛季CBA联赛之同曦
日期:2015-12-23 12:38:582016猴年福章徽章
日期:2016-02-18 15:30:34
5 [报告]
发表于 2014-08-19 12:40 |只看该作者
  1. awk -F'[,\t ]+' 'NR==FNR{a[$3]++;next}$2 in a' file1 file2
复制代码

论坛徽章:
0
6 [报告]
发表于 2014-08-19 12:45 |只看该作者
帮你修改了下,try
  1. root@ubuntu:/tmp# awk -F' *|,' 'NR==FNR{a[$3];next}{if($2 in a)print $0}'  file1 file2
  2. chr1    16950470        rs12144467      C       T       ...
  3. root@ubuntu:/tmp#
  4. root@ubuntu:/tmp# more file1
  5. fam1,chr1,16950470,0.833266667007005
  6. fam1,chr1,76190271,0.684558404931228
  7. fam1,chr1,103427994,0.48393638491905
  8. fam1,chr1,111863039,0.980521031104692
  9. root@ubuntu:/tmp# more file2
  10. chr1    16877405        .       G       A         ...   
  11. chr1    16910063        rs3872319       C       T          ...
  12. chr1    16950470        rs12144467      C       T       ...
复制代码

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
7 [报告]
发表于 2014-08-19 13:27 |只看该作者
搞生物的略多.

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
8 [报告]
发表于 2014-08-19 13:27 |只看该作者
cat -A 看看是否有特殊字符吧

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
9 [报告]
发表于 2014-08-19 14:08 |只看该作者
回复 6# love_shift


    awk读多个文件时,分割符怎么设置的?

    你的脚本中 “*|,” 代表什么意思?

论坛徽章:
0
10 [报告]
发表于 2014-08-19 14:09 |只看该作者
回复 8# dn833
我有好几个文件要处理,不是就这一个,每一个我都试了,都会忽略第一行,而且找出来的第一行也不会在同一个位置,就算是格式不一样,也不会这么巧吧?

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP