2016-01-08 3 views
4
$ echo "a b c" | awk 'BEGIN {OFS=","}; {print $0};' - 
a b c 

Я пытался увидеть, если OFS применяется после последнего поля, так что ожидает выход быть либоПочему не работает OFS?

a,b,c 

или

a,b,c, 

но смена OFS не работает. Почему это?

+0

Вы не понимаете, основной, фундаментальный синтаксис AWK или понятия - вы должны прочитать книгу Эффективное Awk программирование, 4-е издание по Arnold Robbins, прежде чем начать, чтобы попытаться написать awk-скрипты. –

+0

Спасибо. Какие конструкции вы имеете в виду, что я не понимаю в этом посте? У меня есть книга в pdf-файле, и на какой странице я могу их найти? Я читаю «Язык программирования AWK» Aho et al, прямо сейчас. – Tim

+0

Извините, я не собираюсь искать, какая страница определяет, какую конструкцию языка и где найти примеры, которые их объясняют. Сначала прочитайте книгу, а затем обратитесь к ней позже, не пытайтесь выучить язык, но просматриваете конструкцию в то время, когда вы сталкиваетесь с ней. Книга, которую вы имеете, крайне устарела - избавиться от нее и получить ту, которую я предложил. –

ответ

5

Вы должны изменить/установить поле, чтобы пересчитать $0, тогда будет применен OFS. Например.

echo "a b c" | awk 'BEGIN {OFS=","}; {$1=$1;print $0};' 
+0

Спасибо. (1) Почему это работает? (2) Совместим ли он с другими встроенными переменными, такими как ORS, ...? или это уникально для OFS? – Tim

+0

присваивает значение только полем, в результате чего вычисляется $ 0. 'sub(), gsub()' на '$ 0' не будет. Если в полях нет изменений, когда вы печатаете $ 0, awk берет всю строку, а не поля NF. то же самое для sub/gsub Я думаю, что одна из причин этого - производительность. @ Tim – Kent

+0

@Tim (2) Нет, ORS будет применяться во всех случаях. потому что он выглядит как строка, а не поля. Когда вы печатаете строку, ORS поставляется в любом случае. – Kent

1

$ 0 не изменяется путем присвоения OFS. Однако $ 0 изменяется при назначении любому из его элементов, включая любые несуществующие поля.

echo "a b c" | awk 'BEGIN {OFS = ","}; {$ 4 = ""; print $ 0}; -

дает: а, б, в,

Смежные вопросы