简体   繁体   中英

awk or perl one liner + verify array values with awk one liner command

Please advice how to verify with awk / perl one liner command line the following

I want to check if the values from DATA_ARRAY array are exactly 120 if one or more values are different from 120 then awk will give false

For example

Awk will give TRUE if all values are 120

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

Awk will give FALSE if one or more values are different from 120

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

You can do this:

$ 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"
        }'

Explanation

  • -vd="${DATA_ARRAY[*]}" passes the array to awk as the variable d .
  • BEGIN{} things to do when you do not have any stdin.
  • n=split(d,a) split the array based on space (the default separator). The number of fields obtained is returned by split() and saved into var n .
  • for (i=1;i<=n;i++) if (a[i]!=120) {print "False"; exit} print "True" for (i=1;i<=n;i++) if (a[i]!=120) {print "False"; exit} print "True" loop through the array elements checking if the value is 120. If not, print "False" and exit. If no exit has happened, print True.

Example

$ 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

To save into a variable, do:

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"}')

OR

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

--edit--

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

For Variable

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

Test

[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

How about this? Still one-liner.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM