LINUX.ORG.RU
ФорумAdmin

awk непонятно часть выражения

 ,


0

1

Помогите понять,что значит единица после фигурных скобок:

echo ‘one,two,three,four,five’ |awk -v FS=, ‘{NF=3}1’

И что значит ${$1=$1} в

echo ‘one,two,three,four,five’ |awk -v FS=, -v NF=3 ‘{$1=$1}1’

Заранее прошу прощения что недогуглил,или не внимательно прочёл man


Это такой трюк. Здесь 1 - это условие, которое всегда истинно. Если есть условие и за ним нет блока команд, то подразумевается команда печати всей записи (строки).

Такие команды в awk эквивалентны:

{
    print $0
}
1 {
    print $0
}
1 {
    print
}
1

твоя команда {NF=3}1 может быть записана так:

{NF=3}
{print}
legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)

1 означает печать всего, тоже самое что {print}.

Зачем тут {$1=$1} не знаю. Он ничего не делает в этом выражении.

Ну и оба выражения сводятся к

echo 'one,two,three,four,five' | awk -F, '{NF=3}1'
anonymous
()
Ответ на: комментарий от legolegs

Спасибо! Не сочтите за наглость, по поводу второго вопроса, можете помочь: Что значит: ${$1=$1}

В данном случае:

echo‘one,two,three,four,five’ | awk -v FS=, -v NF=3 ‘{$1=$1}1’

w1rox
() автор топика
Ответ на: комментарий от anonymous

Во втором NF=3 не работает и $1=$1 действительно не нужен, какая-то хрень действительно

$1=$1 бывает нужно, чтобы применить выходной разделитель полей:

echo 'one,two,three,four,five' |awk -v FS=, -v OFS=: '{$1=$1}1'
legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Благодарю!

порекомендуйте пожалуйста ресурсы для хорошего изучения awk и sed. Ещё раз спасибо )!

w1rox
() автор топика
Ответ на: комментарий от legolegs

Конкретно это не имеет смысла, имхо.

применить дефолтный выходной разделитеь " ":

 echo ‘one,two,three,four,five’ |awk -v FS=, -v NF=3 '{$1=$1}1'
‘one two three four five’

awk -v FS=, -v NF=3  '1'                     
‘one,two,three,four,five’

anonymous
()
Ответ на: комментарий от w1rox

Да там всё по-русски написано:

Пара шаблон-действие имеет вид:

шаблон { действие } 

Шаблон или действие можно не указывать. Если для шаблона не задано действие, соответствующая строка просто выдается.

Вот 1 - это шаблон.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

А, точно. Не разглядел. Но NF всё равно лишний.

Да оно там все лишнее - заменить запятые проще и читаемее sed 's/,/ /g', а не таким хаком.

anonymous
()
Ответ на: комментарий от anonymous

Да оно там все лишнее - заменить запятые проще и читаемее sed 's/,/ /g', а не таким хаком.

Вас несёт. Хак в оригинальном скрипте именно '1' — дурацкий фокус. NF через -v задавать действительно бессмысленно, но в { } наоборот вполне правильный приём, означающий, что нас интересует в $0 только указанное количество полей.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от legolegs

Шаблон-Действие

Единица как шаблон,что означае, что где встречается единица произвести действие в фигурных скобках?

w1rox
() автор топика
Ответ на: Шаблон-Действие от w1rox

Единица как шаблон,что означае,

Зачем вы так упорно хотите выучить этот дурацкий фокус? Там же всё дурацкое, начиная от того, что это и не шаблон вовсе.

vodz ★★★★★
()
Ответ на: комментарий от legolegs

знак доллара единица это как позиционные переменные или это встроенные переменные awk? Прошу не ругать,баш только начинаю изучать?

w1rox
() автор топика
Ответ на: Шаблон-Действие от w1rox

https://www.opennet.ru/man.shtml?topic=awk&category=1

шаблоны представляют собой произвольные логические комбинации (с использованием !, ||, && и круглых скобок) относительных выражений и расширенных регулярных выражений.

Шаблон - это выражение, которое истинно или ложно. 1 всегда истинна, 0 всегдп ложь, а /abc/ истинно только, когда исходная запись совпадает с регулярным выражением. Это же азы программирования!

legolegs ★★★★★
()
Ответ на: комментарий от w1rox

В данном случае это awk и к башу отношения не имеет. У баша $1 это совсем другое, их не надо путать и нельзя давать башу раскрывать свои башевские $1 внутри программы awk, поэтому программы awk (внутри скриптов/команда bash) обычно заключают в одинарные кавычки.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Шаблон - это выражение, которое истинно или ложно.

Зря упирают в awk, что до действия это считать шаблоном. Какое-то шаблонирование :) Правильнее всего наверное было б «логическое выражение», куда хорошо бы вписалось и BEGIN и /reg/ и expr.

vodz ★★★★★
()
Ответ на: комментарий от legolegs

Согласен истина,ложь это примитив,но выражение, шаблон как-то сбивает с толку Спасибо за ликбез )

w1rox
() автор топика
Ответ на: комментарий от vodz

Согласен, тем более, что в «шаблоне» можно ещё и запись менять.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от vodz

Вас несёт. Хак в оригинальном скрипте именно '1' — дурацкий фокус. NF через -v задавать действительно бессмысленно, но в { } наоборот вполне правильный приём, означающий, что нас интересует в $0 только указанное количество полей


Точно меня? Я то как раз про оригинал целиком («оно там все лишнее»). Хак - это неочевидный прием, который выполняется из-за побочных действий. Т.е. $1=$1, где присвоением идентичного занчения вызывая «автомагическую» обработку $0.

anonymous
()
Ответ на: комментарий от anonymous

Я то как раз про оригинал целиком

Как так можно «целиком», если два скрипта с разным результатом? В первом — дурацкий трюк с 1, во втором бесполезное -v NF. Но присваивание, изменяющее $0 зачастую и есть необходимое действие в awk-программе.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от legolegs

$1=$1 - выходной разделитель

Прочитал весь ман, две книги по awk пересмотрел, но не нашёл упоминание о том, что $1 - это OFS Сорри если был не внимателен

w1rox
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.