按行名进行表格筛选:awk&python&R

引入

Excel确实很强大。
用Excel查找一行很容易,同样的事情1000次就很复杂。
批量查询的需求应运而生~
实验狗确实需要各种帮助,不然就傻傻复制啦~

1.awk读取多个文件

awk 'BEGIN{OFS=FS="\t"}ARGIND==1{print $0, $1;}ARGIND==2{}' file1 file2

1)awk初步提取位置和其他信息(可适当添加)

pengzw@super-server:~/reference/At$ awk -F "[= \t]" '$3 == "gene" {print$11"\t"$4"\t"$5}' Athaliana_167_TAIR10.gene.gff3|head -n 5
AT1G01010   3631    5899
AT1G01020   5928    8737
AT1G01030   11649   13714
AT1G01040   23146   31227
AT1G01050   31170   33153

2)awk对两个文件处理:按照名字筛选

awk 'NR==FNR{a[\$1]}NR!=FNR{if (\$1 in a) print $0}' id id.all > out 

命令解释:NR==FNR和ARGIND==1和FILENAME=ARGV[1]表示第一个文件,NR!=FNR和NR>FNR以及ARGIND==1和FILENAME=ARGV[2]都表示第二个文件,a[$1]=1: 索引操作,类似于python中的字典。

将结果输出到out中,第一个NR==FNR读取ID,第二个,如果第二个文件的第一行在第一个文件中,就输出第二文件

pengzw@super-server:~/reference/phytozome/at$ cat id
AT1G01010
AT1G01020
pengzw@super-server:~/reference/phytozome/at$ cat id.all
AT1G01010   3631    5899
AT1G01020   5928    8737
AT1G01030   11649   13714
AT1G01040   23146   31227
AT1G01050   31170   33153
pengzw@super-server:~/reference/phytozome/at$ awk 'NR==FNR{a[$1]}NR!=FNR{if ($1 in a) print $0}' id id.all > out 
pengzw@super-server:~/reference/phytozome/at$ cat out
AT1G01010   3631    5899
AT1G01020   5928    8737

2.利用python中的panda筛选

import pandas as pd 
df1 = pd.read_csv('D:/TPM.csv', encoding='gbk') #加encoding=‘gbk’是因为文件中存在中文,不加可能出现乱码
df2 = pd.read_csv('D:/ID.csv', encoding='gbk')
index = df1[u'Gene_ID'].isin(df2['gene']) #用2中的行名去筛选1中共有行名的行
outfile = df1[index]
outfile.to_csv('D:/result.csv', index=False, encoding='gbk') 

注意:
不会用python,可以直接在windows装一个Anaconda,利用win+R—jupyter notebook—New—python3—复制代码即可。

3.利用R中merge函数筛选

ID=read.csv('geneID.csv')  #f含有geneID列
All_TPM<-read.csv('All_TPM.csv') #含有geneID列,同上
TPM<-merge(All_TPM,ID,by='geneID') #按照列名进行筛选,保证ID和All_TPM列名相同
head(TPM)
write.csv(TPM,"TPM.csv")

3.参考文章

https://blog.csdn.net/destiny_python/article/details/78663460

你可能感兴趣的:(按行名进行表格筛选:awk&python&R)