【问题标题】:select lines based on multiple criteria from a second file using awk or similar使用 awk 或类似方法从第二个文件中选择基于多个条件的行
【发布时间】:2018-01-10 10:35:28
【问题描述】:

我有两个文件,并且想根据第二个文件(条件文件)满足的多个条件来标记一个文件(数据文件)的行。

数据文件:

支架 核苷酸位置 x SNP1 SNP2 001 345。 G T 001 568。 GC 001 1945 年。 TC 001 5001。 TA 001 5600。 TG 001 6001。在 001 10889。甲 001 12001。 TA 001 15001。甲 002 45 . C T 002 104 . G T 002 598。钙 002 4800。 TA 002 5001。 GC 002 7200。 TA 002 9845。甲乙 002 11001。 TC 002 13450。甲 003 123 . C T 003 125 .甲乙 003 155 .交流电 003 500 . TC 003 983 . CG 003 1001。 G T 004 2 .甲乙 004 567。 TC 004 901。钙 004 5672。 TG 004 9001。 CG 004 10098。一个T

条件文件:

Scaffold Locus_type Min Max
001 外显子 4456 5543
001 外显子 5678 6668
001 外显子 8955 9939
001 外显子 10778 13444
002 外显子 4785 4800
002 外显子 5200 8000
002 外显子 10000 12000
003 外显子 124 154
003 外显子 854 1025
004 外显子 21 852
004 外显子 8951 9512

期望的输出:

001 345。 G T 001 568。 GC 001 1945 年。 TC 001 5001。 T A *外显子中的 SNP 001 5600。 TG 001 6001。外显子中的 T *SNP 001 10889。 G A *外显子中的 SNP 001 12001。 T A *外显子中的 SNP 001 15001。甲 002 45 . C T 002 104 . G T 002 598。钙 002 4800。 T A *外显子中的 SNP 002 5001。 GC 002 7200。 T A *外显子中的 SNP 002 9845。甲乙 002 11001。 T C *外显子中的 SNP 002 13450。甲 003 123 . C T 003 125 .外显子中的 A G *SNP 003 155 .交流电 003 500 . TC 003 983 . C G *外显子中的 SNP 003 1001。 G T *外显子中的SNP 004 2 .甲乙 004 567。 TC 004 901。钙 004 5672。 TG 004 9001。 C G *外显子中的 SNP 004 10098。 A T

使用 awk 的命令失败:

awk 'NR==FNR{a[$1]=$3 FS=="\t" $4;next}{if (a[$1]==$1 && $3&lt=$2 && $4>=$2) 打印 $0, "*外显子中的单核苷酸多态性"; else print $0, "";}' Condition_file.txt Data_file.txt

基本上,我只想标记数据文件中包含核苷酸 (SNP) 的行,该核苷酸 (SNP) 落在第二个文件(或条件文件)中列出的每个已识别外显子的范围(最小值和最大值)内。每个支架有多个 SNP 和外显子,我认为这是导致 awk 命令出现问题的原因。

注意:我的真实数据文件有数千个支架、SNP 和外显子

这似乎是一个非常基本的问题,但鉴于我的经验有限,我不知所措。非常感谢您的帮助。

【问题讨论】:

    标签: arrays bash shell awk compare


    【解决方案1】:
    awk '
    NR==FNR{                    # In condition.txt
      min[$1]=min[$1]"-"$3;     # Assign the min and max for $1 to array min and max
      max[$1]=max[$1]"-"$4;     # The delimeter for each value in both array is "-"
      next
    }
    {
      split(min[$1],min1,"-");  # split the value in min & max to min1 & max1
      split(max[$1],max1,"-");
      str=$0;
      for(i in min1){
        if($2>=min1[i]&&$2<=max1[i])  # if the value of $2 in Data.txt meet the criteria
          str=$0"\t*SNP IN EXON"};    # append "\t*SNP IN EXON" to the string
      print str
    }
    ' Condition.txt Data.txt
    

    【讨论】:

    • 我想我可能发现了一个问题......当使用 CWLiu 提供的 awk 命令处理大型数据文件时,脚本失败。我认为这与将大型数组上传到内存有关。例如,预期的应用程序是包含 144,000 行的“condition.txt”文件。如果我将“condition.txt”文件减少到单个脚手架组(即脚手架 1 = 4,000 行),CWliu 的 awk 命令可以正常工作。不幸的是,我有大约 10,000 个脚手架,需要找到另一种方法来相应地解析文件以使脚本正常工作,或者找到另一种方法。
    • 是的,awk 可能有其局限性。您应该找到其他方法来扫描和处理大文件。
    猜你喜欢
    • 2014-05-24
    • 2011-12-07
    • 2021-09-18
    • 2015-08-22
    • 2017-05-21
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    相关资源
    最近更新 更多