【发布时间】: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 数组。