2014-01-17 1 views
1

Я пытаюсь понять gawk в сценариях оболочки. Приведенная ниже команда пытается подсчитать количество абзацев на основе двух (или более) последовательных новых строк, обозначающих конец абзаца.Значение команды awk

gawk 'END{print "Number of paragraphs: "NR}' RS="" tmp.txt 

Как это работает?

+1

Вы можете начать с фактического заявления о проблеме и того, что вы пытаетесь сделать ... –

+0

@ Ryan J следует считать количество абзацев? – john

+0

на основе двух последовательных строк – john

ответ

3

ГНУ awk руководство говорит РС:

пустая строка "" (строка без символов) имеет особое значение в качестве значения РС. Это означает, что записи разделяются одной или несколькими пустыми строками и ничего больше.

Таким образом, ваша программа может быть разобран следующим образом:

gawk 'END{print "Number of paragraphs: "NR}' RS="" tmp.txt 
  1. Выполните команду gawk.
  2. Сценарий gawk - END{print "Number of paragraphs: "NR} (одиночные кавычки удаляются оболочкой). Когда вход завершен, он печатает значение NR, которому предшествует фраза. NR - количество прочитанных записей. Обратите внимание, что это использует неявный оператор конкатенации между фразой и NR. Также можно написать print "Number of paragraphs:", NR, и это даст тот же результат.
  3. RS="" на самом деле рассматривается gawk как RS= (двойные кавычки удаляются оболочкой). Это устанавливает специальный режим, указанный в руководстве. Здесь две или более последовательных строк новой строки будут считаться окончанием абзаца, как и EOF.
  4. Файл обработан tmp.txt.

Таким образом, команда работает из-за специального корпуса, встроенного в gawk.

Все в этой дискуссии относится также к стандарту awk.

+0

, но '' string "" something "и' "string", "something" 'different: one is" pure "concatenation, последний помещает разделитель полей между частями. (только что проверено путем тестирования) – ShinTakezou

+0

Да, они разные. Вы могли заметить, что в альтернативе, предложенной мной, нет пробела после двоеточия, которое было вставлено как разделитель полей OFS (разделитель выходного поля) между двумя аргументами (фраза и NR) из-за запятой, разделяющей аргументы. Вывод печати в вопросе имеет один аргумент; ревизия имеет два. –

+0

поэтому RS = "" menas whats? – john

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

  • Нет связанных вопросов^_^