awk - 如何使用 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
将所有值存储在数组中的第 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
推荐阅读
- google-data-studio - 时间序列图表显示日期间隔用点填充
- blender - 有没有办法将构建修改器用作要在搅拌机中导出到统一的动画?
- javascript - DND(请勿打扰)功能,用于电子邮件、短信等通知
- java - 从 SwingWorker 更新 JProgressBar
- swift - 显示负秒数时 swifts DateComponentsFormatter.zeroFormattingBehavior = .pad 的问题
- xml - 我想使用 XMLT [1.0] 根据标签值命名我的输出 xml 文件吗?
- javascript - Vue 可以在新网站上使用 Paypal 沙盒帐户进行真实交易
- java - 识别 Camunda 中的子执行
- reactjs - 如何使用 Jest & Enzyme (useField Hook) 为 Formik 驱动的输入组件编写测试?
- r - 如何以 10000 次重复优化 r 中的分层随机抽样