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

Posted

技术标签:

【中文标题】使用 AWK 中的另一个文件查询一个文件的内容【英文标题】:Query the contents of a file using another file in AWK 【发布时间】:2019-09-03 03:17:22 【问题描述】:

我正在尝试根据第二个文件中的值有条件地过滤文件。 File1 包含数字,File2 包含两列数字。问题是过滤掉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

有类似问题的博客:

awk: filter a file with another file

awk 'NR==FNRa[$1];next !($2 in a)' d3_tmp FS="[ \t=]" m2p_tmp

Find content of one file from another file in UNIX

awk -v FS="[ =]" 'NR==FNRrows[$1]++;next(substr($NF,1,length($NF)-1) in rows)' File1 File2

file1:(制表符分隔)

AAA BBB 1500
CCC DDD 2500
EEE FFF 2000

file2:(制表符分隔)

GGG 1250 1750
HHH 1950 2300
III 2600 2700

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

file3(输出)

AAA BBB 1500
EEE FFF 2000

【问题讨论】:

查看列出的博客后使用的其他代码包括:`` awk 'NR==FNRa[$1];next (($3 $NF-1)在 a)' file2.txt FS="[ \t]" file1.txt ``` 文件 1 和 2 有多大? 【参考方案1】:

一种方式:

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

读取file2 的内容并将其存储在数组ab 中。读取file1 时,检查整个ab 数组之间的数字并打印。

另一种选择:

$ awk 'NR==FNRfor(i=$2;i<=$3;i++)a[i];next($3 in a)'  file2 file1
AAA BBB 1500
EEE FFF 2000

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

【讨论】:

太棒了,这是我脑子里的逻辑,我告诉自己如果 file2 到它自己的数组中,我必须将每一列加载(就像在你的第一个选项中一样)此外,如果file2 中有一个额外的列将有助于注释我如何更改代码以打印 file1 行但将列从 file2 附加到该行。例如: awk 'NR==FNRa[i]=$2;b[i++]=$3;c[i++]=$4;next 这会将另一列添加到它自己的数组中,我假设 [i++]逻辑是否正确?那么,如果 ($3>=a[j] && $3 在这种情况下,您应该只在 c 中执行 i++ 。如果此答案对您有用,请接受。 awk 'NR==FNRa[i]=$2;b[i]=$3;c[i++]=$4;nextfor(j=0;j=a[j] && $4 file3【参考方案2】:

另一个 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

输出:

AAA BBB 1500
EEE FFF 2000

【讨论】:

以上是关于使用 AWK 中的另一个文件查询一个文件的内容的主要内容,如果未能解决你的问题,请参考以下文章

如何使用doctrine查询symfony2中实体类中的另一个实体

如何使用 Microsoft Visual Studio 将查询插入到 C# 中的另一个查询中?

grep sed awk

linux三大文件处理工具(grep/sed/awk)

将查询结果存储在变量中以在 Postgresql 中的另一个查询中使用

Apollo Client Angular:如何将从查询中获得的数据作为参数传递给graphql中的另一个查询?