【问题标题】:How to use awk to search for strings in a while read loop如何使用 awk 在 while 读取循环中搜索字符串
【发布时间】: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


【解决方案1】:

您可以试试这个awk,它将所有值存储在region 数组的第一列和motif 数组的第二列,同时通过file1。稍后,如果在region 数组中找到$18 并且在motif 数组中找到$15,我们从file2 打印记录:

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

【讨论】:

  • 请提供来自file2 的示例输入,以便我可以根据需要进行测试和调整。
  • 我编辑了问题以添加file2的示例,感谢您的帮助
  • 在 file2 中你有 TGC 但在 file1 你有 CTG 所以不匹配
  • 它仍然不适合我,所以我不知道发生了什么。也许这与我的文件格式有关...
  • 好的,问题是我必须将 dos2unix 转换为 file1。掌心表情符号!不过感谢这段代码,它帮助解决了 UTR 区域名称中的单引号问题。也比我尝试的方式更快。
猜你喜欢
  • 2015-01-12
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 2021-05-22
相关资源
最近更新 更多