Chinaunix

标题: 请教:awk如何根据文件1中的关键字提取文件2中的内容? [打印本页]

作者: Ienovo_qq    时间: 2013-09-11 11:07
标题: 请教:awk如何根据文件1中的关键字提取文件2中的内容?
文件1:
4238
4240

文件2
4237  MY4237A
4237  MY4237B
4238  MY4238A
4238  MY4238B
4238  MY4238C
4239  MD4239A
4240  MY4240A
4240  MY4240B
4240  MY4240C
4240  MD4240A
4240  MD4240B
4240  MD4240C

要求根据文件1中的字段1为关键字提取文件2中的内容,输出如下:
4238  MY4238A
4238  MY4238B
4238  MY4238C
4240  MY4240A
4240  MY4240B
4240  MY4240C
4240  MD4240A
4240  MD4240B
4240  MD4240C

请各位大侠支招,先谢谢了。


作者: 关阴月飞    时间: 2013-09-11 11:08
  1. grep -wf  file1 file2
复制代码

作者: Ienovo_qq    时间: 2013-09-11 11:10
回复 2# 关阴月飞
这么快,谢谢,能用awk实现吗?


   
作者: 关阴月飞    时间: 2013-09-11 11:11
回复 3# Ienovo_qq
  1. awk 'FNR==NR{a[$0]=$0;next}a[$1]'  file1 file2
复制代码

作者: Ienovo_qq    时间: 2013-09-11 11:16
回复 4# 关阴月飞


    经测试,能满足要求,多谢多谢。
作者: Ienovo_qq    时间: 2013-09-11 11:26
又是用的数组,我理解一下:FNR==NR{a[$0]=$0}读文件1,数组a[4238]=4238,a[4240]=4240; next}a[$1] next读文件2,a[$1]以文件2的第一列进行匹配,省略print $0。不知对不对?
作者: li0924    时间: 2013-09-11 13:53
awk 'NR==FNR{a[$1]=1;next}{if(a[$1]==1)print $0}'
作者: li0924    时间: 2013-09-11 14:00
回复 4# 关阴月飞
想法很独特!赞!


   
作者: 关阴月飞    时间: 2013-09-11 14:41
本帖最后由 关阴月飞 于 2013-09-11 14:42 编辑

@li0924
回复 6# Ienovo_qq

”又是用的数组,我理解一下:FNR==NR{a[$0]=$0}读文件1,数组a[4238]=4238,a[4240]=4240; next}a[$1] next读文件2,

a[$1]以文件2的第一列进行匹配,省略print $0 “

最后的a[$1] 是用来做断判的:
a[$1] ==》 if(a[$1])  即 a[$1]  不为空值 或 0  则打印 $0

为了保险上面四楼代码得改一下(借签7楼用法,可避$0值为0时会出现错误):
  1. awk 'FNR==NR{a[$0]=1;next}a[$1]'  file1 file2
复制代码

作者: Ienovo_qq    时间: 2013-09-11 14:44
各位高手,佩服佩服。
作者: howge    时间: 2013-09-22 16:21
学习了!
回复 9# 关阴月飞


   
作者: fh21_xuejinlian    时间: 2016-05-19 17:20
awk  'NR==FNR{a[$1]=$1}NR!=FNR{if(a[$1])print $0}'  file1 file2
作者: hechao7021    时间: 2019-04-20 16:57
回复 1# Ienovo_qq

我的数据跟楼主的类似,用上面的代码都输不出数据,求赐教第一个文件:a.txt
LOC_Os01g01160
LOC_Os01g06454
LOC_Os01g17030
LOC_Os01g53020第二个文件:b.txt
LOC_Os05g50810        5        29142204        +        CHH        CTC
LOC_Os05g50810        5        29142215        +        CHH        CAA
LOC_Os01g01160        5        29142259        -        CHH        CTT
LOC_Os01g01160        5        29145615        +        CHH        CCA
LOC_Os01g01160        5        29145616        +        CHH        CAT
LOC_Os05g50810        5        29145869        -        CHH        CTA
LOC_Os01g06454        5        29145890        -        CHH        CAT
LOC_Os01g06454        5        29145912        -        CHH        CTT
LOC_Os05g50810        5        29145913        -        CHH        CCT
LOC_Os01g17030        5        29146309        +        CHH        CTA
LOC_Os01g17030        5        29146385        +        CHH        CAA
LOC_Os05g50810        5        29146426        +        CHH        CAA
LOC_Os01g53020        6        853213        -        CHH        CAC







欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2