【问题标题】:awk or perl one liner + verify array values with awk one liner commandawk 或 perl one liner + 使用 awk one liner 命令验证数组值
【发布时间】:2014-03-19 12:00:32
【问题描述】:

请告知如何使用 awk / perl 单行命令行验证以下内容

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

例如

如果所有值都是 120,Awk 将给出 TRUE

echo ${DATA_ARRAY[*]}
120 120 120 120

如果一个或多个值与 120 不同,Awk 将给出 FALSE

echo ${DATA_ARRAY[*]}
120 120 115 120

【问题讨论】:

    标签: linux perl awk ksh


    【解决方案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{} 没有任何标准输入时要做的事情。
    • n=split(d,a) 根据空格(默认分隔符)拆分数组。得到的字段数由split()返回,保存到var n中。
    • for (i=1;i&lt;=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"}')
    

    【讨论】:

    • 是否可以将错误值插入到参数中进行打印?
    • 是的,当然,只要result=$(awk ...)
    • 解释清楚 fedorqui +1
    【解决方案2】:

    $ 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
    

    【讨论】:

    • 谢谢 fedorqui,我刚刚做到了
    • No exit 语句实际上在您使用END 块时没有任何效果,如果您有任何文件测试此命令awk 'NR==2{exit}1;END{print "I am not bothered about exit hey hey"}' file
    • 我从 awk 得到错误,最后一个代码“第 1 行附近的错误”
    • @Awk 请注意,要让 Eytan 接收消息,您必须输入 @ + name,中间不能有任何空格。
    • @fedorqui 非常感谢 +1
    【解决方案3】:

    这个怎么样?还是单线。

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

    【讨论】:

    • awk 方法失败,假设数据数组包含1201 那么它仍然给你true
    • 好的,我清理了awk代码,好像gsub不适合。
    • 好的,为grep +1 方法不错。
    猜你喜欢
    • 2017-06-12
    • 2012-09-01
    • 2012-11-02
    • 2016-11-22
    • 2014-07-31
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 2015-02-04
    相关资源
    最近更新 更多