使用 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
的内容并将其存储在数组a
和b
中。读取file1
时,检查整个a
和b
数组之间的数字并打印。
另一种选择:
$ 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# 中的另一个查询中?