【问题标题】:Matching a particular word excluding words beginning by "?"匹配特定单词,不包括以“?”开头的单词
【发布时间】:2021-02-10 15:12:19
【问题描述】:

当某个单词在 CSV 文件中也以问号开头时,我很难找到如何匹配该单词。我需要使用 tcsh 代码。

我的意思是我可以匹配“cat”同时排除“zcat”但它包含“?cat”。这是我的代码:

#!/bin/tcsh -f
set viewSet = PRE_IMPL
set nbViewSet=`awk -F ";" '{ for (i=1; i<=NF; i++) { if ($i == "VIEW SETS") print i } }' csv.csv`
/usr/bin/awk -F ";" -v col="$nbViewSet" '(match($col, '"/\<"$viewSet"\>/"') != 0) {print}' csv2.csv

因此,使用此代码,我将以下内容作为输入 CSV 文件:

STANDARD KEYS;COMPATIBLE KEYS;CELL KEY;COND KEY;WORKSPACE PATH;VIEW PATH;CATEGORIES;CONDS SECTION;VIEW SETS;TYPES
;;;;;;;;PRE_IMPL;
;;;;;;;;zPRE_IMPL;
;;;;;;;;?PRE_IMPL;
;;;;;;;;PRE_IMPL;

所以在这里我只想匹配单词“PRE_IMPL”,既不匹配“zPRE_IMPL”也不匹配“?PRE_IMPL”。我的代码设法排除“zPRE_IMPL”但不排除“?PRE_IMPL”,我没有设法改变它,输出是:

;;;;;;;;PRE_IMPL;
;;;;;;;;?PRE_IMPL;
;;;;;;;;PRE_IMPL;

如何更改我的代码以仅匹配“PRE_IMPL”?

【问题讨论】:

  • @Sylvain_cmz,很高兴你以代码的形式展示了你的努力,你能否在你的问题中发布更清晰的示例,然后让我们知道。

标签: shell csv awk tcsh


【解决方案1】:

您可以使用(^|[^?])PRE_IMPL 之类的正则表达式来要求匹配项位于字段的开头,或者位于不是问号的字符旁边。

切线,这里不需要运行两次 awk。 (或者在一个地方使用/usr/bin/awk,在另一个地方只使用awk。)

awk -F ";" -v viewSet="$viewSet" '
  NR==1{ for (i=1; i<=NF; i++) if ($i == "VIEW SETS") col=i; next }
  match($col, "(^|[^?])" viewSet "\>")' csv2.csv

【讨论】:

  • 幸运的是,这避免了任何取决于您使用的 shell 的代码。我将重复我的建议,尝试从 tcsh 过渡,它不再拥有非常小众的用户群。
  • 我的 Awk 不喜欢 "\&gt;" 但如果它适合你,那就去吧。我通过类似地用"([^A-Za-z0-9_]|$)"替换它来让它工作。
  • 谢谢我所需要的一切,我现在正在过滤我的 CSV 文件!很高兴我能这么快得到帮助:) 我会看看我能做些什么来摆脱 tcsh,我一开始就使用这个脚本来学习 regexp 和 shell 的使用。肯定 tsch 不是最有效的做这种脚本,我会看看我能改变什么!
猜你喜欢
  • 1970-01-01
  • 2014-10-16
  • 2018-07-26
  • 1970-01-01
  • 2019-11-19
  • 2020-05-11
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
相关资源
最近更新 更多