【发布时间】:2021-05-12 15:00:44
【问题描述】:
我想遍历文件 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
【问题讨论】:
-
file1 (tab separated file with你必须将字段分隔符设置为制表符 -
@KamilCuk - 试过了,但没有任何改变
标签: awk