【问题标题】:AWK: check value if exists in bash arrayAWK:检查值是否存在于 bash 数组中
【发布时间】:2021-01-13 07:31:16
【问题描述】:

awk 中,我有一个文件,其中每一行都包含一个范围在1..16 范围内的数字$5。例如:

X;X;X;X;1;X;X
X;X;X;X;8;X;X
X;X;X;X;25;X;X
X;X;X;X;5;X;X

我想检查字段$5 中的数字并打印与该值相关的消息。例如:

1;in range
8;in range
25;not in range 
5;in range

我在下面有这段代码,但有点不方便;

awk -F";" 'OFS";" {if (($5=="1" || $5=="2" || $5=="3" || $5=="4" || $5=="5" || $5=="6" || $5=="7" || $5=="8" || $5=="9" || $5=="10" || $5=="11" || $5=="12" || $5=="13" || $5=="14" || $5=="15" || $5=="16") && $5!="") print $5 OFS "in range"}
{if (!($5=="1" || $5=="2" || $5=="3" || $5=="4" || $5=="5" || $5=="6" || $5=="7" || $5=="8" || $5=="9" || $5=="10" || $5=="11" || $5=="12" || $5=="13" || $5=="14" || $5=="15" || $5=="16") && $5!="") print $5 OFS "not in range"}'

因为我创建了一个数组;

arr=(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)

我尝试像这样实现https://stackoverflow.com/a/15394738/14320738 中显示的方法,但没有成功:

awk -F";" 'OFS";" {if ($5=="${arr[*]}" && $5!="") print $5 OFS "in range"}
    {if (($5!="${arr[*]}" && $5!="") print $5 OFS "not in range"}'

array 和 awk 命令都在同一个脚本下。 我不知道如何使用awk。新手来了,

谢谢。

编辑:如果有办法在 awk 中使用数组方法,我将不胜感激。

编辑 2: 在有用的 cmets 之后,我得出的结论是 bash 数组无法传递到 awk 数组中

【问题讨论】:

  • 如果您坚持使用数组,您需要首先通过 -v 标志将数组传递给 awk(请参阅此问答 - Can I pass an array to awk using -v? - 讨论这是如何实现的不像听起来那么容易);或者,如果您一直使用相同的(静态)数组,那么您可以在awk 中定义数组(例如,在BEGIN {...} 块中);但如果你只有几个连续的范围,那么我可能会调整 RavinderSingh13 的答案以包含所需的范围
  • @AhmetSaidAkbulut :您已将 Array 定义为 bash 数组。您不能将 bash 数组传递给 awk 数组。您可以将 bash 数组写入文件,然后将文件读入 bash 数组;或者,由于arr 仅包含数字,您可以将其转换为环境变量,所有这些数字用空格分隔,并在 awk 内部将此变量的内容拆分为 awk 数组。

标签: arrays bash shell awk


【解决方案1】:

恕我直言,您无需在此处创建数组,您只需在 awk 中运行条件并相应地打印语句。

awk -F';' '{if($5>=1 && $5<=16){print $5"; in range"} else{print $5";not in range"}}' Input_file

【讨论】:

  • 看起来你比我快 30 秒 :)
  • 这很简单:D
  • 我尝试在 awk 中使用数组。范围也可以是 A-Z。
  • @AhmetSaidAkbulut,你展示的样本你不需要使用我相信,这个简单的条件在这里可以工作,干杯。
【解决方案2】:

使用大于和小于...

awk -F";" '{ if ($5 >= 1 && $5 <= 10) print $5, "In range"; else print $5, "Not in range" }' <file>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2015-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    相关资源
    最近更新 更多