awk或perl one liner +使用awk one liner命令验证数组值

时间:2014-02-19 09:09:38

标签: linux perl awk ksh

请建议如何使用awk / perl one liner命令行验证以下内容

如果一个或多个值与120不同,我想检查DATA_ARRAY数组中的值是否正好为120,那么awk将给出错误

例如

如果所有值都是120

,则awk将为TRUE
echo ${DATA_ARRAY[*]}
120 120 120 120

如果一个或多个值与120

不同,则awk将给出FALSE
echo ${DATA_ARRAY[*]}
120 120 115 120

3 个答案:

答案 0 :(得分:1)

你可以这样做:

$ awk -v d="${DATA_ARRAY[*]}"
         'BEGIN{
               n=split(d,a);
               for (i=1;i<=n;i++) if (a[i]!=120) {print "False"; exit}
               print "True"
        }'

解释

  • -v d="${DATA_ARRAY[*]}"将数组作为变量d传递给awk。
  • BEGIN{}当你没有stdin时要做的事情。
  • n=split(d,a)根据空格(默认分隔符)拆分数组。获得的字段数由split()返回并保存到var n
  • for (i=1;i<=n;i++) if (a[i]!=120) {print "False"; exit} print "True"遍历数组元素,检查值是否为120.如果不是,则打印“False”并退出。如果没有退出,请打印True。

实施例

$ DATA_ARRAY=(120 120 120)
$ awk -v d="${DATA_ARRAY[*]}" 'BEGIN{ n=split(d,a); for (i=1;i<=n;i++) if (a[i]!=120) {print "False"; exit} print "True"}'
True

$ DATA_ARRAY=(120 120 1)
$ awk -v d="${DATA_ARRAY[*]}" 'BEGIN{ n=split(d,a); for (i=1;i<=n;i++) if (a[i]!=120) {print "False"; exit} print "True"}'
False

要保存到变量中,请执行以下操作:

myvar=$(awk -v d="${DATA_ARRAY[*]}" 'BEGIN{ n=split(d,a); for (i=1;i<=n;i++) if (a[i]!=120) {print "False"; exit} print "True"}')

答案 1 :(得分:1)

$ echo "${DATA_ARRAY[*]}" | awk '$1!=val{print "error"}' RS=' ' val="120"

<强> - 编辑 -

$ echo "${DATA_ARRAY[*]}" | awk '!f && $1!=val{print "False"; f=1}END{if(!f)print "True"}' RS=' ' val="121"

对于变量

$ my_variable=$(echo "${DATA_ARRAY[*]}" | awk '!f && $1!=val{print "False"; f=1}END{if(!f)print "True"}' RS=' ' val="120")

测试

[akshay@aix tmp]$ DATA_ARRAY=(120 120 120 120)
[akshay@aix tmp]$ my_variable=$(echo "${DATA_ARRAY[*]"} | awk '!f && $1!=val{print "False"; f=1}END{if(!f)print "True"}' RS=' ' val="120") 
[akshay@aix tmp]$ echo $my_variable
 True

[akshay@aix tmp]$ DATA_ARRAY=(120 120 120 125)
[akshay@aix tmp]$ my_variable=$(echo "${DATA_ARRAY[*]}" | awk '!f && $1!=val{print "False"; f=1}END{if(!f)print "True"}' RS=' ' val="120") 
[akshay@aix tmp]$ echo $my_variable
 False

答案 2 :(得分:1)

这个怎么样?还是单行。

[[ $(grep -wo 120 <<<${DATA_ARRAY[*]}|wc -l) -eq ${#DATA_ARRAY[*]} ]] && echo "true" || echo "fail"