引入
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
网友评论