首页 > 解决方案 > 如何使用 awk 在 while 读取循环中搜索字符串

问题描述

我想遍历文件1,它有两列。每列都有一个字符串,我想用它来搜索具有 18 列的数据框文件 (file2)。我想从 file2 中选择两个不同列中包含来自 file1 的两个字符串的行来创建一个新文件。

file1(大约 150 行的制表符分隔文件,没有标题)

#region      motif
Exon         ATG
Exon         CTG
5' UTR       GCC
3' UTR       GGC

file2(大约 150 万行的制表符分隔文件 - 有一个标题)有 18 列。第 18 列包含来自文件 1 的区域信息,第 15 列包含来自文件 1 的主题信息。

chr start   end period  copyNum consensusSize   perMatch    perIndel    score   A   C   G   T   entropy motif   sequence    ID  region
chr1    15798   15822   3   8.3 3   77  0   29  0   40  20  40  1.52    TGC TGCTCCTGCTCCTTCTGCTGCTGCT   chr1_15798_15822_TGC    Exon
chr9    140196426   140196441   3   5.3 3   84  0   25  0   31  62  6   1.2 GGC GGCGGCGGCTGCGGCG    chr9_140196426_140196441_GGC    5' UTR
chr1    19282560    19282579    3   6.7 3   76  0   26  5   40  25  30  1.77    CTG CTGCTGCTGCTCCAGCTGCT    chr1_19282560_19282579_CTG  Exon
chr8    131028679   131028694   3   5.3 3   100 0   32  0   62  37  0   0.95    GCC GCCGCCGCCGCCGCCG    chr8_131028679_131028694_GCC    5' UTR

预期的输出是包含 file2 中的所有列,但仅包含两个字符串上与文件 1 匹配的行。从示例中,file2 中的第 3 行和第 4 行应该在输出中。

当我在不通过循环的情况下手动执行时,它工作正常。但是一旦它进入循环,我就会得到一个空的输出文件。这是我到目前为止所尝试的:

while read REGION MOTIF; do
       awk '$18 == "'${REGION}'" && $15 == "'${MOTIF}'"' file2 >> output.txt
done < file1.txt

I get the following errors:
awk: cmd. line:1: ($18 == "Exon" && $15 == "CAG
awk: cmd. line:1:                          ^ unterminated string
awk: cmd. line:1: ($18 == "5'" && $15 == "UTR
awk: cmd. line:1:                        ^ unterminated string

还尝试了以下没有错误但输出文件为空的方法:

while read REGION MOTIF; do
       awk -v a="$REGION" -v b="$MOTIF" '($18 == a && $15 == b)' file2.txt >> output.txt
done < file1.txt

如果我在命令行中执行一行,它就可以工作。因此,我相信这与区域和主题变量如何传递到 awk 有关。不能手动工作的是 5' UTR 和 3' UTR,因为我猜它们有单引号。

awk '($18 == "Exon" && $15 == "CTG")' file2.txt > output.txt

or

awk -v a="Exon" -v b="CAG" '($18 == a && $15 == b)' file2.txt > output.txt

标签: awk

解决方案


您可以尝试awk将所有值存储在数组中的第 1 列和region数组中的第 2 列,motif同时通过file1. 稍后我们从file2如果$18在数组中找到并在region数组$15中找到记录打印motif

awk -F'\t' 'NR==FNR {region[$1]; motif[$2]; next}
$18 in region && $15 in motif' file1 file2

输出:

chr1    15798   15822   3   8.3 3   77  0   29  0   40  20  40  1.52    CTG TGCTCCTGCTCCTTCTGCTGCTGCT   chr1_15798_15822_TGC    Exon

推荐阅读