繁体   English   中英

awk比较两个不同文件中的字段

[英]awk compare fields from two different files

在这里,我尝试了awk脚本来比较两个不同文件中的字段。

awk 'NR == FNR {if (NF >= 4) a[$1] b[$4]; next} {for (i in a) for (j in b)  if (i >= $2 && i <=$3 && j>=$2 && j<=$3 ) {print $1, $2, $3, i, j; next}}' file1 file2

输入文件:

文件1:

24926   17  206 25189   5.23674 5.71882 4.04165 14.99721    c     
50760   17  48  50874   3.49903 4.25043 7.66602 15.41548    c     
104318  15  269 104643  2.94218 5.18301 5.97225 14.09744    c     
126088  17  70  126224  3.12993 5.32649 6.14936 14.60578    c     
174113  16  136 174305  4.32339 2.36452 8.60971 15.29762    c     
196474  14  89  196626  2.24367 5.16966 7.33723 14.75056    c  
......
......

文件2:

GT_004279   1   280
GT_003663   19891   20217
GT_003416   22299   23004
GT_003151   24916   25391
GT_001715   39470   39714
GT_001585   40896   41380
....
....

我得到的输出是:

GT_004279 1 280 2465483 2639576
GT_003663 19891 20217 2005645 2005798
GT_003416 22299 23004 2291204 2269898
GT_003151 24916 25391 2501183 25189
GT_001715 39470 39714 3964440 3950417
......
......

所需的输出应该是file1的第一和第四字段值位于file2的第二和第三字段值之间。 例如,如果我已将上述给定的行作为INPUT文件,则输出必须是..

GT_003151   24916   25391   24926   25189

如果我猜对了,问题出在If循环内。 因此,有人可以帮助纠正此问题。

谢谢

您需要制作复合键并对其进行迭代。 创建此类组合键时,它们由SUBSEP变量分隔。 因此,您只是基于此拆分并进行检查。

awk '
NR==FNR{ flds[$1,$4]; next }
{
  for (key in flds) {
    split (key, fld, SUBSEP)
    if ($2<=fld[1] && $3>=fld[2])
      print $0, fld[1], fld[2]
  }
}' file1 file2
GT_003151   24916   25391 24926 25189

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM