Оператор Awk else-if, похоже, выполняется дважды

ask() {
   # $1 ---> message to user
   # $2 ---> "VARIABLE NAME" in which read will store response

   case ${2-} in
      '' | *[!a-zA-Z0-9_]* | [0-9]* )
          echo >&2 "Oops you've selected an invalid variable name: \`$2'"
          exit 1;;
   esac

   read -p "$1" "$2"

   eval "
      case \${$2:++} in
         '' )
               echo >&2 'Empty response not allowed.'
               ask '$1' '$2';;
         * )
            echo \"\${$2}\";;
      esac
   "
}

VarName=${1-'humpty_dumpty'}
ask "Provide the user database: " "$VarName"
1
28.05.2019, 09:10
2 ответа

Команда printвсегда добавляет новую строку. Таким образом, print "\n"печатает указанную вами новую строку плюс добавленную.

Вы можете использовать print ""или printf "\n".

1
27.01.2020, 23:22

Это связано с тем, что оператор printпо умолчанию добавляет новую строку в конец строки, которую он печатает. При использовании с \nон печатает двойную новую строку -, как вы видите на выходе. Используйте printfвместо

awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else printf "\n" }' file

Без явных конструкций ветвления, if..else if..else, вы можете просто сделать

awk 'NF>3 { print $4; next } NF==1 { print $1; next } { printf "\n" }'
2
27.01.2020, 23:22

Теги

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