美文网首页
根据 1.txt 将 2.txt 中有 1.txt 的行提取出来

根据 1.txt 将 2.txt 中有 1.txt 的行提取出来

作者: ytbao | 来源:发表于2021-11-07 16:06 被阅读0次

基础,记录一下好复制,菜鸡记不住代码不复制写不出来。准备寒假把碰到过的代码都汇总一下记录下来。

下面 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

相关文章

网友评论

      本文标题:根据 1.txt 将 2.txt 中有 1.txt 的行提取出来

      本文链接:https://www.haomeiwen.com/subject/fwfdzltx.html