在 AWK 中使用另一个文件查询一个文件的内容
Query the contents of a file using another file in AWK
我正在尝试根据第二个文件中的值有条件地过滤一个文件。 File1 包含数字,File2 包含两列数字。问题是过滤掉 file1 中那些落在 file2 每一行中表示的范围内的行。
我有一系列有效的循环,但根据两个文件的长度,运行 需要 >12 小时。此代码在下面注明。或者,我尝试使用 awk,并查看了发布在 slack overflow 上的其他问题,但我不知道如何适当地更改代码。
循环方法:
while IFS= read READ
do
position=$(echo $READ | awk '{print }')
while IFS= read BED
do
St=$(echo $BED | awk '{print }')
En=$(echo $BED | awk '{print }')
if (($position < "$St"))
then
break
else
if (($position >= "$St" && $position <= "$En"));
then
echo "$READ" | awk '{print [=10=]"\t EXON"}' >> outputfile
fi
fi
done < file2
done < file1
有类似问题的博客:
awk: filter a file with another file
awk 'NR==FNR{a[];next} !( in a)' d3_tmp FS="[ \t=]" m2p_tmp
Find content of one file from another file in UNIX
awk -v FS="[ =]" 'NR==FNR{rows[]++;next}(substr($NF,1,length($NF)-1) in rows)' File1 File2
文件 1:(制表符分隔)
AAA BBB 1500
CCC DDD 2500
EEE FFF 2000
文件 2:(制表符分隔)
GGG 1250 1750
HHH 1950 2300
III 2600 2700
预期输出将保留 file1(在新文件 file3 中)的第 1 行和第 3 行,因为这些记录位于 file2 的第 1 行第 2 列和第 3 列以及第 2 行第 2 列和第 3 列的范围内。在实际文件中,它们不受行限制,即我不想查看 file1 的 row1 并与 file2 的 row1 进行比较,而是将 row1 与 file2 中的所有行进行比较以获得命中。
file3(输出)
AAA BBB 1500
EEE FFF 2000
一种方式:
awk 'NR==FNR{a[i]=;b[i++]=;next}{for(j=0;j<i;j++){if (>=a[j] && <=b[j]){print;}}}' i=0 file2 file1
AAA BBB 1500
EEE FFF 2000
读取file2
内容并将其存储在数组a
和b
中。读取 file1
时,检查数字是否在整个 a
和 b
数组之间并打印。
多一个选项:
$ awk 'NR==FNR{for(i=;i<=;i++)a[i];next}( in a)' file2 file1
AAA BBB 1500
EEE FFF 2000
File2
被读取,整个数字范围被分解并存储到关联数组 a
中。当我们读取file1
时,我们只需要查找数组a
.
另一个awk。根据文件大小,它可能有意义也可能没有意义:
$ awk '
NR==FNR {
a[]= # hash file2 records, is key, value
next
}
{
for(i in a) # for each record in file1 go thru ever element in a
if(<=i && >=a[i]) { # if it falls between
print # output
break # exit loop once match found
}
}' file2 file1
输出:
AAA BBB 1500
EEE FFF 2000
我正在尝试根据第二个文件中的值有条件地过滤一个文件。 File1 包含数字,File2 包含两列数字。问题是过滤掉 file1 中那些落在 file2 每一行中表示的范围内的行。
我有一系列有效的循环,但根据两个文件的长度,运行 需要 >12 小时。此代码在下面注明。或者,我尝试使用 awk,并查看了发布在 slack overflow 上的其他问题,但我不知道如何适当地更改代码。
循环方法:
while IFS= read READ
do
position=$(echo $READ | awk '{print }')
while IFS= read BED
do
St=$(echo $BED | awk '{print }')
En=$(echo $BED | awk '{print }')
if (($position < "$St"))
then
break
else
if (($position >= "$St" && $position <= "$En"));
then
echo "$READ" | awk '{print [=10=]"\t EXON"}' >> outputfile
fi
fi
done < file2
done < file1
有类似问题的博客:
awk: filter a file with another file
awk 'NR==FNR{a[];next} !( in a)' d3_tmp FS="[ \t=]" m2p_tmp
Find content of one file from another file in UNIX
awk -v FS="[ =]" 'NR==FNR{rows[]++;next}(substr($NF,1,length($NF)-1) in rows)' File1 File2
文件 1:(制表符分隔)
AAA BBB 1500
CCC DDD 2500
EEE FFF 2000
文件 2:(制表符分隔)
GGG 1250 1750
HHH 1950 2300
III 2600 2700
预期输出将保留 file1(在新文件 file3 中)的第 1 行和第 3 行,因为这些记录位于 file2 的第 1 行第 2 列和第 3 列以及第 2 行第 2 列和第 3 列的范围内。在实际文件中,它们不受行限制,即我不想查看 file1 的 row1 并与 file2 的 row1 进行比较,而是将 row1 与 file2 中的所有行进行比较以获得命中。
file3(输出)
AAA BBB 1500
EEE FFF 2000
一种方式:
awk 'NR==FNR{a[i]=;b[i++]=;next}{for(j=0;j<i;j++){if (>=a[j] && <=b[j]){print;}}}' i=0 file2 file1
AAA BBB 1500
EEE FFF 2000
读取file2
内容并将其存储在数组a
和b
中。读取 file1
时,检查数字是否在整个 a
和 b
数组之间并打印。
多一个选项:
$ awk 'NR==FNR{for(i=;i<=;i++)a[i];next}( in a)' file2 file1
AAA BBB 1500
EEE FFF 2000
File2
被读取,整个数字范围被分解并存储到关联数组 a
中。当我们读取file1
时,我们只需要查找数组a
.
另一个awk。根据文件大小,它可能有意义也可能没有意义:
$ awk '
NR==FNR {
a[]= # hash file2 records, is key, value
next
}
{
for(i in a) # for each record in file1 go thru ever element in a
if(<=i && >=a[i]) { # if it falls between
print # output
break # exit loop once match found
}
}' file2 file1
输出:
AAA BBB 1500
EEE FFF 2000