【问题标题】:How to use awk to find the line starting with a variable如何使用awk查找以变量开头的行
【发布时间】:2019-03-14 17:24:42
【问题描述】:

我知道关于 awk 的两件事:

1.

PAT='aGeneName'
awk -v var="$PAT" '$3 ~ var {print $0}' file.txt  # will print the line where 3rd field includes the variable $PAT

2.

awk '$3 ~ /^aGeneName/' file.txt # will print the line where 3rd field starts with string "aGeneName"

但我想要的是这两者的组合:我想打印第三个字段以变量 $PAT 开头的行,类似于

PAT='aGeneName'
awk -v var="$PAT" '$3 ~ /^var/ {print $0}' file.txt  # but this is wrong, since variable can't be put into //

【问题讨论】:

  • 为什么不只是PAT='^pattern'
  • 谢谢,这在我的简单示例中有效。但这会改变变量,因此在更复杂的情况下,需要将变量作为其原始形式(在本例中为“模式”)重用,这会带来问题
  • 不要在软件中使用 pattern 这个词进行比较,因为它非常模棱两可。始终使用 stringregexp 代替(或 globbing pattern,如果您在 shell 中匹配文件名),这样您和阅读您的代码或要求的任何人都可以清楚地知道您想要什么样的匹配。
  • 谢谢埃德莫顿。你是对的。我已将问题和所选答案中的“模式”更改为“aGeneName”。但是在我编辑了 Tiw 的答案后,它说“在经过同行评审之前,只有你才能看到这个编辑。”希望它很快会被同行评审,所有读者都可以看到修改后的版本。

标签: awk


【解决方案1】:

一种方式是这样的:

PAT='aGeneName'
awk -v var="$PAT" '$3 ~ "^" var {print $0}' file.txt

并且{print $0}可以保存在这里,这是隐含的。

另一种方式,当模式var是一个简单的字符串时,里面没有RegEX字符:

PAT='aGeneName'
awk -v var="$PAT" 'index($3, var)==1' file.txt

【讨论】:

  • 非常感谢!它们都适合我。
  • @XiaokangZH 我接受了你的编辑,并稍微改进了它,因为我认为如果我们在描述中也使用aGeneName,它会导致另一种模棱两可:)
猜你喜欢
  • 2021-10-15
  • 2017-11-25
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
相关资源
最近更新 更多