基础,记录一下好复制,菜鸡记不住代码不复制写不出来。准备寒假把碰到过的代码都汇总一下记录下来。
下面 txt 文件都以 tab 键分隔。
1.txt 只有1列
less 1.txt
shabi
niubi
doubi
less 2.txt
1 shabi 5
2 niubi 6
3 doubi 7
4 goubi 8
grep -wf 1.txt 2.txt | less (要求 1.txt 文件只有1列)
grep -w 字符串精确匹配 -f 查找符合规则条件的文件内容
1 shabi 5
2 niubi 6
3 doubi 7
1.txt 有多列
less 1.txt
chr01 100330275 100330430 DTT DNA
chr01 102223401 102223874 Gypsy LTR
chr01 102233809 102234021 Helitron DNA
less 2.txt
11.7 chr01 100330275 100330430 860599524 C DTT DNA 1746
3.7 chr01 102239470 102239653 858690301 C Gypsy LTR 15
1.9 chr01 102223401 102223874 858706080 + Gypsy LTR 726
0.3 chr01 102250480 102251137 858678817 + DNA DNA 98
4.4 chr01 102233809 102234021 858695933 + Helitron DNA 5260
0.5 chr01 102235542 102235743 858694211 + DNA DNA 2700
根据 1.txt 将 2.txt 中有 1.txt 的行提取出来
awk 'NR==FNR{a[$2$3$4$7$8]=$0;next}{print a[$1$2$3$4$5]}' 2.txt 1.txt
行数多的文件放前面
指定 2.txt 所有列($0)为变量a,以 2.txt 的 $2$3$4$7$8 列为索引,再NR!=FNR,转换到1.txt,
如果 1.txt 的 $1$2$3$4$5 列在索引中,输出相应的 a,即满足条件的2.txt所有列
似乎前后两个a里面的列要是完全一样的,不一样如前$2$3$4$7$8,后$1$2$3$4,出不来结果
11.7 chr01 100330275 100330430 860599524 C DTT DNA 1746
1.9 chr01 102223401 102223874 858706080 + Gypsy LTR 726
4.4 chr01 102233809 102234021 858695933 + Helitron DNA 5260
awk 'NR==FNR{a[$2$3$7$8]=$1"\t"$2;next}{print a[$1$2$4$5]}' 2.txt 1.txt
行数多的文件放前面
指定 2.txt 所有列($0)为变量a,以 2.txt 的 $2$3$7$8 列为索引,再NR!=FNR,转换到1.txt,
如果 1.txt 的 $1$2$4$5 列在索引中,输出相应的 a,即满足条件的 2.txt 的第1列,第2列
11.7 chr01
1.9 chr01
4.4 chr01
根据 1.txt 提取 2.txt,将 1.txt 里有,2.txt 里没有的内容也输出
less 1.txt
chr01 37496 38688 Plori03G0121900
chr01 37600 37936 Plori03G0121900
chr01 38283 39786 Plori05G0213000
chr01 38782 39785 Plori05G0213000
less 2.txt
chr01 37496 38688 LTR_unknown
chr01 37600 37936 TIR_CACTA
chr01 38283 39786 TIR_Tc1_Mariner
chr01 38782 39785 LTR_unknown
chr01 46227 53014 LTR_Gypsy
chr01 63008 64066 LTR_Gypsy
awk 'NR==FNR{a[$1$2$3]=$4;next}{print $0"\t"a[$1$2$3]}' 1.txt 2.txt |awk 'NF==5{print $0 }'
行数少的文件放前面
一定不能忘了后面的awk 'NF==5{print $0 }',判断列数输出想要的结果
NR=FNR为真时,判断当前读入的是第一个文件,然后使用{a[$1$2$3]=$4;next}循环将1.txt文件的第4列存入数组a,
并将1.txt的第1列,第2列,第3列作为索引
当NR=FNR为假时,判断当前读入了第二个文件,输出第二个文件的所有列$0,如果在第二个文件第1列第2列第3列匹配到了
作为索引的第一个文件的第1列第2列第3列,就把第一个文件的第4列也一起输出,后面再判断列数输出想要的结果
chr01 37496 38688 LTR_unknown Plori03G0121900
chr01 37600 37936 TIR_CACTA Plori03G0121900
chr01 38283 39786 TIR_Tc1_Mariner Plori05G0213000
chr01 38782 39785 LTR_unknown Plori05G0213000
网友评论