【问题标题】:Awk for i in range NF, if $i ~ /pattern/ print $i如果 $i ~ /pattern/ print $i 在 NF 范围内对 i 进行 awk
【发布时间】:2014-04-13 15:27:08
【问题描述】:

我试图在包含 n 个字段的行中查找一个字段。字段的数量是可变的,我的目标字段的位置并不总是相同的(即它并不总是像 $4 那样)。我试图想出一个简短的代码来实现“对于范围为 1 到 NF 的字段 $i,如果 $i 包含 /pattern/ print $i”,如下所示,这是行不通的:

awk'{for(i=1;i<=NF;i++)} if ($i~/Start/) {print $i}' <filename>

如果列具有我要进行模式匹配的标签,我将尝试打印一整列。例如,如果列是 /Alt/,我想打印整列。但是如果我事先不知道该字段,如何找到该字段编号然后使用它来打印该字段?以下是表格样本(基因组数据):

Chr Start End Ref Alt Func.refGene Gene.refGene
1 865584 865584 G A exonic SAMD11
1 865628 865628 G A exonic SAMD11
1 865662 865662 G A exonic SAMD11
1 865694 865694 C T exonic SAMD11
1 865700 865700 C T exonic SAMD11
1 865705 865705 C T exonic SAMD11
1 871215 871215 C G exonic SAMD11
1 871229 871229 G C exonic SAMD11

我尝试过这样的事情,但我永远无法让它完全发挥作用:

如果有人介绍了这个,请提前抱歉,我看了很多,没有发现这个问题。我只使用 awk 大约两个星期,二月份才开始编程。非常感谢您的意见!

【问题讨论】:

  • 您的代码的所有问题是在awk' 之间缺少空格,并且在for 条件之后有一个虚假的右括号(})。你的 shell 应该告诉你第一个问题,然后 awk 告诉你第二个语法错误,并在你尝试运行它时指出你正确的那个字符。如果这些没有发生,您需要获得一个新的 shell 和/或一个新的 awk。如果这些 DID 发生了,除了您不理解的错误消息之外是什么?
  • 嗨,埃德——实际上,缺少空间只是我的糟糕、红眼、通宵复制和粘贴工作;)

标签: regex awk


【解决方案1】:

也许应该这样做:

awk 'NR==1 {for(i=1;i<=NF;i++) if ($i~/Alt/) f=i;next} {print $f}' file
A
A
A
T
T
T
G
C

它将在1行中搜索Alt的位置,然后将该位置存储在f
找到后,它将打印存储在 f 中的列中的数据

【讨论】:

  • +1 用于找出想要的东西。我没有读完他的脚本,因为我没有任何预期的输出,也没有说明它“不起作用”的方式,而且脚本有几个语法错误,所以我认为这是他的问题.我怀疑他真的想要$i=="Alt",但这可能对他的数据没有任何影响。
  • 谢谢你们,也很抱歉我的回答不好,下次我会更加小心!这个解决方案有效,Jotne。你能告诉我第一行 NR==1 到底在做什么吗?
  • NR==1 仅对第一行执行此操作。 NR 是行号。
  • 我怎样才能在第一行(实际上是未知数,但包含已知模式)之外的其他行上进行这项工作?我有一个遗传变异的 VCF 文件,其中我的“标题”行总是以 #CHROM 开头。然后它包含字段名称,包括样本名称 - 然后我想提取特定样本的列,但是这个 #CHROM 行前面是带有可变行数的长标题(都以 ## 开头)所以NR==1 不起作用对我来说。
  • PS:我要使用的标题行也是文件中包含示例名称的唯一行,因此我也可以直接匹配示例名称,但是我的尝试仍然失败:/
猜你喜欢
  • 2017-01-01
  • 2017-04-10
  • 2016-03-18
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多