【问题标题】:How can I make nawk evauluate two if conditions as one?我怎样才能让 awk 评估两个 if 条件作为一个?
【发布时间】:2017-02-17 16:20:08
【问题描述】:

对于数据集:

12345   78945
12345   45678

我需要输出是

12345   45678

长话短说,由于某些高于我的工资等级的做法,有时两个值代表同一个对象。因此,对于代表同一对象的已知值对列表,我需要 awk 从输出中过滤它们。在上述情况下 12345 和 78945 代表同一个对象,所以应该过滤掉。其余行是应引起我注意的错误。

我尝试的代码

cat data | nawk '(($1!="12345")&&($2!="78945"))'

产生一个空集作为输出。因此,要么我在脑海中犯了一个逻辑错误,要么是一个语法错误,nawk 正在单独评估每个条件,就像写成 cat data | nawk '($1!="12345")&&($2!="78945")' 一样,因此过滤掉了这两个条件,因为两者都不符合第一个条件。

我确定这只是我不熟悉 nawk 如何解决此类问题。提前感谢您的任何帮助。由于某些原因,这必须在 nawk 中完成。

【问题讨论】:

  • 顺便说一句:nawk 是一个抽象,在不同的平台上有不同的含义。最好提一下具体的底层 Awk 实现。
  • wrt And for reasons, this has to be done in nawk. - 什么原因?如果是因为您使用的是 Solaris - 不要使用 nawk,因为它比 /bin/awk(又名旧的、损坏的 awk)功能更强大,但 nawk 本身已经过时并且是 POSIX 之前的版本。请改用 /usr/xpg4/bin/awk。
  • 感谢您的提示。以后我会牢记这一点。

标签: awk multiple-conditions


【解决方案1】:

您的示例数据中没有任何行$1!="12345" 为真,因此不存在&& 任何其他条件都可以为真的条件。想想看。这与 awk 无关——它是简单的布尔逻辑。

请尝试以下任何一种,以您认为更清晰的方式为准:

nawk '($1!="12345") || ($2!="78945")' data
nawk '!(($1=="12345") && ($2=="78945"))' data
nawk '($1=="12345") && ($2=="78945"){next} 1' data
nawk '($1" "$2) != "12345 78945"' data
nawk '!/^[ \t]*12345[ \t]+78945([ \t+]|$)/' data

另外谷歌 UUOC 来了解我为什么摆脱 cat data |

【讨论】:

  • 那么逻辑错误,哈哈。我看了一会儿,不知出于什么原因,始终没有得出这么明显的结论。我想在我的脑海中我在想类似nawk '!(($1=="12345") && ($2=="78945"))' data 的东西,但最终输入了我所做的,就好像它们是等价的一样。显而易见的选择当然是||我只需要其中一个条件为假即可知道输出该行。谢谢。
猜你喜欢
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多