【问题标题】:remove lines that do not match specific digits in list file using awk使用 awk 删除与列表文件中的特定数字不匹配的行
【发布时间】:2016-05-19 13:58:54
【问题描述】:

我正在尝试使用awk 删除file 中与list$2NM_ 之后但. 之前的数字不匹配的行。谢谢你:)。

文件

204 NM_003852   chr7    +   138145078   138270332   138145293   
204 NM_015905   chr7    +   138145078   138270332   138145293   

列表

TRIM24 NM_015905.2

awk

awk -v OFS="\t" '{ sub(/\r/, "") } ; NR==FNR { N=$2 ; sub(/\..*/, "", $2); A[$2]=N; next } ; $2 in A { $2=A[$2] } 1' list file > out

电流输出

204 NM_003852   chr7    +   138145078   138270332   138145293   
204 NM_015905.2 chr7    +   138145078   138270332   138145293   

期望的输出(删除第 1 行,因为那是不匹配的行)

204 NM_015905.2 chr7    +   138145078   138270332   138145293

【问题讨论】:

  • 抱歉,我试图完善我的数据,但请明白你的意思。谢谢你:)

标签: awk


【解决方案1】:
awk 'NR==FNR{split($2,f2,".");a[f2[1]];next} $2 in a' list file

【讨论】:

  • 所以我知道list 中的$2. 上拆分,然后匹配到file。拆分后的部分放入a[f2] 数组中,当在file 中找到匹配项时,该数组放在$2 匹配之后,NR==FNR 告诉awk 只保留匹配行?我希望我明白了……作为一名科学家,我尽力而为。非常感谢:)。
  • 正确。经过这么多的曝光,我想你已经掌握了它的要点。 f2[1] 是分割字段的第一部分,是第二次文件查找的关键。我们将这些键保存在a 数组中,并在第二个文件处理中查找,如果发现它被打印出来(缺少显式语句但默认操作)。
  • 非常感谢,非常感谢 :)
【解决方案2】:
$ awk -F'[ .]' 'NR==FNR{a[$2];next}$2 in a' list file
204 NM_015905   chr7    +   138145078   138270332   138145293

【讨论】:

  • awk 使用. 分隔每个$2 值,将其存储在键a 中,并使用该键在file 中查找匹配项。使用NR==FNR 只保留匹配的行。这就是我理解它的方式,并且由于我仍在学习,可能会遗漏一些东西。谢谢你:)。
  • @Rakete1111 不,它不会。这绝对是基本的 awk,任何不理解它的人都会从学习手册页的位置和瞥一眼中获得更多的收获,而不是我只用勺子喂他们这些说明(顺便说一句,这些说明出现在数千个其他答案中),并且他们总是可以像 OP 一样提出问题或发布他们的解释以进行验证。
  • @Chris - 不确定这是否是您的意思,但 NR==FNR 是阵列填充与测试的区别。条件NR==FNR 仅在读取第一个文件时为真,因此与next 结合的测试确保其余代码填充第一个文件的数组并测试第二个文件。
  • 这对我来说不是基本的(我从不使用awk :) 但是很好,重点。下次我会做得更好:)
  • 感谢@Ed Morton 的澄清 :)
猜你喜欢
  • 2012-07-13
  • 2017-09-24
  • 2020-04-15
  • 2015-04-12
  • 2013-10-08
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多