Расширения $ -не выполняются должным образом после перенаправления

Я сделал это с помощьюawk:

awk 'BEGIN{f=0;OFS=" ";t=0;}  {if(f == 0 && $3 == 1) {ff=$1;f=1;next} if(f==1 && $3 == 1) {r=$2;} \
 if(t == 0 && $3 == 0) {print ff,r,1;ff=$1;t=1;next} if(t==1 && $3 == 0) {r=$2;}}  END{print ff,r,0}' file

Он кажется большим, но подход прост: проверьте, равен ли последний столбец 1 или 0, а затем напечатайте 1-й столбец 1-й строки и 2-й столбец последней строки.

Сокращенная версия:

awk 'BEGIN{f=0;OFS=" ";t=0;}  {if($3 == 1) {if(f==0){ff=$1;f=1;next} else{r=$2;}} \
else{if(t==0){print ff,r,1;ff=$1;t=1;next} else{r=$2;}}}  END{print ff,r,0}' file

Изначально f и t имеет значение 0, затем в первый раз $3==0затем ff будет равно первому столбцу и f=1, а для дальнейших строк возьмем r=$2. Аналогично для $3==0.

4
01.06.2019, 04:51
1 ответ

Это оставлено неопределенным, поэтому каждой оболочке разрешено делать то, что она хочет, и ей не нужно документировать подробности. (С исторической точки зрения это не было определено, потому что разные оболочки выполняли разные функции. )Технически ракушка может подбрасывать монету. На практике детали того, что работает в отдельной среде, а что нет, могут зависеть от оптимизаций, сделанных в определенных случаях, например. в зависимости от того, является ли команда встроенной -, в зависимости от того, есть ли перенаправление на/от /dev/null, в зависимости от того, активны ли ловушки,в зависимости от того, действует ли set -e, в зависимости от того, является ли команда последней в списке и т. д.

Из SUSv4 (POSIX.1 -2008)«Оболочка и утилиты» — §2.9.1 «Простые команды»:

If the command name is not a special built-in utility or function, the variable assignments shall be exported for the execution environment of the command and shall not affect the current execution environment except as a side-effect of the expansions performed in step 4. In this case it is unspecified:

  • Whether or not the assignments are visible for subsequent expansions in step 4

  • Whether variable assignments made as side-effects of these expansions are visible for subsequent expansions in step 4, or in the current shell execution environment, or both

Для пояснения :«шаг 4» включает расширение параметра (, например.${i:=7})и арифметическое расширение (, например.$((i=7))). Расширения переменных, которые «не должны влиять на текущую среду выполнения», находятся в начале команды, например. i=7 ls. Таким образом, в этом абзаце среди прочего говорится, что если раскрытие параметра или раскрытие переменной изменяет значение переменной, не указано, повлияет ли это на результат после возврата команды.

На практике оболочки обычно применяют перенаправление к внешней команде, сначала разветвляя и выполняя перенаправление в подоболочке. Но они отличаются тем, определяют ли они цель перенаправления до или после создания подоболочки.

3
27.01.2020, 20:57

Теги

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