【问题标题】:How to create a logic that substract results of two awk logics?如何创建一个减去两个 awk 逻辑结果的逻辑?
【发布时间】:2021-10-11 19:34:59
【问题描述】:

我需要帮助从下面的 awk 结果中减去 2。谁能给我一个见解?

  1. 在第 12 列中查找按指定单词过滤的总行数
  2. 在第 12 列中查找由指定单词过滤并在第 13 列中具有指定日期的行总数
  3. 减去 1 和 2 并打印结果

这解决了问题 1

awk -F ',' '$12 ~ /<WORD>/ {count++} END {print count}' file.csv

这解决了问题 2

awk -F ',' '$12 ~ /<WORD>/ && $13 ~ /<DATE>/ {count2++} END {print count2}'  file.csv

很遗憾,我没有得到下面问题 3 的结果。

awk -F ',' '$12 ~ /<WORD>/ {count++} END {print count}' file.csv; awk -F ',' '$12 ~ /<WORD>/ && $13 ~ /<DATE>/ {count2++} END {print count2}'  file.csv; awk {print $count-$count2}

【问题讨论】:

  • 这很难理解。一些样本输入数据和预期输出会有所帮助。它还有助于格式化您的代码示例。不清楚为什么你有两个不同的 awk 脚本。
  • 第一个代码示例是解决问题 1 和 2。我正在尝试将 1 和 2 组合并减去它们
  • 太棒了!这要清楚得多。看来你也有答案了。
  • 除其他外,我猜您应该使用完整的字符串比较时使用部分正则表达式比较。它也不清楚输出是否应包含所有 3 个值或仅包含减法后的最后一个值。如果您edit 您的问题包括简洁、可测试的样本输入和预期输出,那么我们可以为您提供帮助。
  • @EdMorton 我实际上是在寻找部分正则表达式。我正在寻找最终输出(#3)。我认为它足够基本,我不需要提供任何样本。

标签: csv awk


【解决方案1】:

如果您运行多个 awk 命令,则使用的变量不会共享。如果您希望它们被共享,您可以将这些命令组合到一个程序中:

awk -F ',' '
    $12 ~ /<WORD>/ {count++}
   '$12 ~ /<WORD>/ && $13 ~ /<DATE>/ {count2++}
   END {print $count-$count2}
' file.csv

但是,您的三个规范似乎简化为:

打印 csv 文件 file.csv 在第 12 列中包含特定单词并且在第 13 列中包含特定日期的行数

awk -F, '$12~/word/ && $13!~/date/ {n++} END {print n+0}' file.csv

其中/word//date/ 是分别提供所需单词和日期的正则表达式。

【讨论】:

  • 非常感谢!我不得不在第二个正则表达式之间添加括号,效果很好! awk -F, '$12~/word/ &amp;&amp; ! ($13~/date/) {n++} END {print n+0}' file.csv)
  • 可以用今天的日期作为日期吗?这似乎不起作用awk -F, '$12~/word/ &amp;&amp; ! ($13~/$(date '+%Y%m%d')/) {n++} END {print n+0}' file.csv)
猜你喜欢
  • 1970-01-01
  • 2016-05-22
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多