Как сравнить значения столбца, разделенные /

В функцию передается просто строка. Если вы запустите func somevar, будет передана строка somevar. Если вы запустите func $somevar, будет передано (слово -разделенное )значение переменной somevar. Также это не ссылка на переменную, указатель или что-то в этом роде, это просто строки.

Если вы хотите передать имя переменной в функцию, а затем просмотреть значение этой переменной, вам потребуется использовать ссылку на имя (Bash 4.3 или более поздней версии, IIRC )или косвенная ссылка ${!var}. ${!var}расширяется до значения переменной, имя которой хранится в var.

Итак, у вас просто неправильный способ в сценарии, если вы передаете имя переменной в функцию, используйте "${!1}", чтобы получить значение переменной, названной в $1, и просто "$1", чтобы получить имя .

. это напечатает variable bar is empty, exitingи закроет оболочку:

#!/bin/bash
exitIfEmpty() {
    if [ -z "${!1}" ]; then
        echo "variable $1 is empty, exiting"
        exit 1
    fi
}
foo=x
unset bar
exitIfEmpty foo
exitIfEmpty bar
-1
12.07.2020, 09:46
2 ответа

Используя только awk, вам нужно управлять несколькими совпадениями (, что-то вроде того, что вы можете найти в этом посте).

Это мой чистый-awkраствор:

awk '{
  match($0, /[0-9]+\/[0-9]+/);                      # match number/number pattern
  pattern=substr($0,RSTART, RLENGTH);               # store match in $pattern
  match(pattern, /[0-9]+/);                         # match first number
  num1=substr(pattern,RSTART,RLENGTH);              # store it in $num1
  sub(/[0-9]+\//,"",pattern);                       # remove 'number/' from $pattern
  match(pattern, /[0-9]+/);                         # match second number
  num2=substr(pattern,RSTART,RLENGTH);              # store it in $num2
  if ($num1 > $num2){ print num1, ">", num2 }       # do your comparisons
  else if ($num1 < $num2) { print num1, "<", num2 } # as you please
  else { print num1, "=", num2  }                   # (this is just an example)
  }' file

Однако , в этой ситуации я бы фактически использовал sedдля извлечения двух числовых значений, а затем передал бы вывод в awk. Следующая команда делает то же самое, что и выше, но я думаю, что она функционально чище:

sed 's@^.*\([0-9]\+\)\/\([0-9]\+\).*$@\1 \2@' file |
  awk '{if ($1 > $2){ print $1, ">", $2 }
        else if ($1 < $2) { print $1, "<", $2 }
        else { print $1, "=", $2  }}'
0
18.03.2021, 23:20

Вы можете использовать splitдля разделения поля на основе второго разделителя, например.

$ awk 'split($2,a,"/") > 1 && a[2] > a[1]+0' file
session-manager-0    3/5    1 >>> want to compare second column value 3 and 5 using awk.
  • , если splitгенерирует не менее 2 значений; и
  • второе значение разделения больше первого (после принудительного числового сравнения)
  • , затем примените правило printпо умолчанию
1
18.03.2021, 23:20

Теги

Похожие вопросы