在awk中查找两个文件之间的列

时间:2016-06-08 14:22:46

标签: arrays awk lookup delimiter

我的FILE1如下:

X<Test>::x

我有FILE2作为以粗体突出显示的ID列表:

  CX    998900  998900  -   CX:998900:998900:**ENSG00000000001:E4**:AAAT:4.468:A1
  CX    998903  998903  -   CX:998903:998903:**ENSG00000000001:E4**:CAAT:6.600:A1
  CX    998889  998890  -   CX:998889:998890:**ENSG00000000003:E5**:TAAT:7.523:A1
  CX    998891  998891  -   CX:998891:998891:**ENSG00000000003:E5**:TAAT:7.518:A1
  CX    998881  998881  -   CX:998881:998881:**ENSG00000000002:E6**:AAAT:4.468:A1
  CX    998883  998883  -   CX:998883:998883:**ENSG00000000003:E6**:AAAT:5.784:A1
  CX    998880  998880  -   CX:998880:998880:**ENSG00000000003:E6**:AAAT:5.784:A1
  CX    998884  998884  -   CX:998884:998884:**ENSG00000000003:E6**:TAAT:6.202:A1

我正在尝试使用以下awk命令从FILE1中的FILE2获取ID的二进制计数

 ENSG00000000001:E4
 ENSG00000000003:E5
 ENSG00000000002:E6  
 ENSG00000000003:E6
 ENSG00000000002:E5

这样我得到了

awk 'NR==FNR{a[NR]=$1;next} FNR==1 && f{print f;for(k in a) print a[k], a[k] in b; delete b}{b[$5]; f=FILENAME}END{print f; for(k in a) print a[k], a[k] in b; delete b}' FILE2 FILE1 

2 个答案:

答案 0 :(得分:2)

我认为你的计数已经关闭或者有一些未指明的情况

$ awk -F'**' -v OFS=':' 'NR==FNR{c[$2]++; next} 
                         $1 in c{print $1,c[$1]; next} 
                                {print $1,0} ' file1 file2

ENSG00000000001:E4:2
ENSG00000000003:E5:2
ENSG00000000002:E6:1
ENSG00000000003:E6:3
ENSG00000000002:E5:0

哦,我看到的不是计数而是一个指标,因为用c[$2]++取代c[$2]=1

如果**不属于该文件,则必须稍加更改

$ awk -F':' 'NR==FNR{c[$4 FS $5]=1; next} 
             $0 in c{print $0,c[$0]; next} 
                    {print $0,0} ' file1 file2

ENSG00000000001:E4 1
ENSG00000000003:E5 1
ENSG00000000002:E6 1
ENSG00000000003:E6 1
ENSG00000000002:E5 0

这可以进一步简化,正如@fedorqui评论的那样。

$ awk -F':' 'NR==FNR{c[$4 FS $5];next} {print $0, $0 in c}' file1 file2

答案 1 :(得分:0)

让我们使用一些非智能的方法。也就是说,将file1中的每一行与整个file2相对应,并获得grep的返回码:

while IFS= read -r line; do
    printf "%s\t%d\n" "$line" "$(grep -q "$line" f1 && echo 1 || echo 0)"
done < f2