使用AWK中的另一个文件查询文件的内容

使用AWK中的另一个文件查询文件的内容,awk,logic,conditional,Awk,Logic,Conditional,我试图根据第二个文件中的值有条件地筛选一个文件。文件1包含数字,文件2包含两列数字。问题是要过滤掉file1中那些在file2的每一行中表示的范围内的行 我有一系列可以工作的循环,但根据两个文件的长度,运行时间超过12小时。该代码如下所示。或者,我尝试使用awk,并查看了slack overflow上发布的其他问题,但我不知道如何适当地更改代码 循环方法: while IFS= read READ do position=$(echo

我试图根据第二个文件中的值有条件地筛选一个文件。文件1包含数字,文件2包含两列数字。问题是要过滤掉file1中那些在file2的每一行中表示的范围内的行

我有一系列可以工作的循环,但根据两个文件的长度,运行时间超过12小时。该代码如下所示。或者,我尝试使用awk,并查看了slack overflow上发布的其他问题,但我不知道如何适当地更改代码

循环方法:

while IFS= read READ
            do  
                position=$(echo $READ | awk '{print $4}')
                    while IFS= read BED
                        do
                            St=$(echo $BED | awk '{print $2}')
                            En=$(echo $BED | awk '{print $3}')
                        if (($position < "$St"))
                            then
                                break 
                        else 
                            if (($position >= "$St" && $position <= "$En"));
                                then 
                                    echo "$READ" | awk '{print $0"\t EXON"}' >> outputfile
                            fi  
                        fi
                        done < file2
            done < file1

文件1:(制表符分隔)

文件2:(制表符分隔)

预期输出将保留file1中的第1行和第3行(在新文件file3中),因为这些记录位于file2的第1行第2列和第3列以及第2行第2列和第3列的范围内。在实际文件中,它们不受行限制,也就是说,我不想查看file1的行1并与file2的行1进行比较,而是将行1与file2中的所有行进行比较以获得命中率

文件3(输出)

单向:

awk 'NR==FNR{a[i]=$2;b[i++]=$3;next}{for(j=0;j<i;j++){if ($3>=a[j] && $3<=b[j]){print;}}}' i=0 file2 file1
AAA BBB 1500
EEE FFF 2000

File2
被读取,整个数字范围被分解并存储到关联数组
a
。当我们读取
文件1
时,我们只需要查找数组
a

另一个awk。它可能有意义,也可能没有意义,这取决于文件大小:

$ awk '
NR==FNR {
    a[$3]=$2                    # hash file2 records, $3 is key, $2 value
    next
}
{
    for(i in a)                 # for each record in file1 go thru ever element in a
        if($3<=i && $3>=a[i]) { # if it falls between
            print               # output
            break               # exit loop once match found
        }
}' file2 file1

查看这些博客后使用的其他代码包括:``awk'NR==FNR{a[$1];next}($3<$NF&&$3>$NF-1)在a)`file2.txt FS=“[\t]”file1.txt``文件1和文件2有多大?太棒了,这是我头脑中的逻辑,我告诉自己,如果文件2有自己的数组,我就必须加载每一列(就像在你的第一个选项中)另外,如果在file2中有一个额外的列,这将是很有帮助的注释,我如何更改代码来打印file1行,但将file2中的列附加到该行。例如:awk'NR==FNR{a[I]=$2;b[I++]=$3;c[I++]=$4;next}这将把另一列添加到它自己的数组中,我假设[I++]逻辑是正确的吗?那么,如果($3>=a[j]&$3在这种情况下,你应该只在
c
中做
i++
。如果这个答案对你有用,请接受它。awk'NR==FNR{a[i]=$2;b[i]=$3;c[i++]=$4;next}{for(j=0;j=a[j]&$4
AAA BBB 1500
CCC DDD 2500
EEE FFF 2000
GGG 1250 1750
HHH 1950 2300
III 2600 2700
AAA BBB 1500
EEE FFF 2000
awk 'NR==FNR{a[i]=$2;b[i++]=$3;next}{for(j=0;j<i;j++){if ($3>=a[j] && $3<=b[j]){print;}}}' i=0 file2 file1
AAA BBB 1500
EEE FFF 2000
$ awk 'NR==FNR{for(i=$2;i<=$3;i++)a[i];next}($3 in a)'  file2 file1
AAA BBB 1500
EEE FFF 2000
$ awk '
NR==FNR {
    a[$3]=$2                    # hash file2 records, $3 is key, $2 value
    next
}
{
    for(i in a)                 # for each record in file1 go thru ever element in a
        if($3<=i && $3>=a[i]) { # if it falls between
            print               # output
            break               # exit loop once match found
        }
}' file2 file1
AAA BBB 1500
EEE FFF 2000