Intereting Posts
Почему «login» и «sudo» развивают дочерний процесс, а не exec () сразу? В Debian, как восстановить / usr / share / doc? Ошибка при установке Manjaro Почему «какой рубин» ничего не выводит? Могу ли я заставить `man` делать сложения в нижнем регистре? Автоматически раскрасить вывод дерева Определение физического объема внутри несезонного диска Спам в Zimbra OpenRelay Установка Kali на USB-накопителе – НЕ Live USB или раздел Persistence Различные сценарии, которые я вижу, не будут проходить через python Как регистрировать вывод приложения-демона? sudo pgrep -f соответствует произвольным строкам и возвращает увеличение pids как печатать ближайший столбец при поиске определенных строк Компиляция g ++ из исходного кода приводит к повреждению стандартной библиотеки. error: ':: realloc' не был объявлен Как использовать uswsusp для режима ожидания / спящего режима с помощью systemd? (Debian)

как распечатать новую строку в awk

Я пытаюсь распечатать собранные данные из файла, где каждый набор получает новую строку (\ n)

Код:

awk '/mail:|fullName:|uid:/{s=s", "$0} END{print substr(s,3)}' dump2.txt 

Результат:

 mail: bogus@bogus.com , fullName: Bogus Bogus, uid: 666 mail: bogus2@bogus.com , fullName: Bogus2 Bogus2, uid: 667 

Желаемый результат:

 mail: bogus@bogus.com , fullName: Bogus Bogus, uid: 666 \n mail: bogus2@bogus.com , fullName: Bogus2 Bogus2, uid: 667 \n 

пытаться

  awk '/mail:|fullName:/{s=s", "$0} /uid:/ {s=s", "$0 "\n" ;} END{printf substr(s,3)}' dump2.txt 

при отсутствии% в поле

другое решение

  awk '/mail:|fullName:/{s=s", "$0} /uid:/ {print substr(s,3) ", "$0 ;s=""} ' dump2.txt 

предполагая, что uid: последний.

вам просто нужно добавить \n в желаемое место:

 awk '/mail:|fullName:|uid:/{s=s", "$0}\n END{print substr(s,3)}' dump2.txt 

Другая техника: не храните все в одной большой строке, распечатайте ее, когда идете вперед:

 awk '$1=="mail:" || $1=="fullName:" {printf "%s, ", $0} $1=="uid:"' dump2.txt 

Примечание: все ниже (очевидно) предполагают, что строка uid: всегда будет последней из каждой группы. Однако все они работают с % символов в данных.

Если вы хотите сохранить все данные и распечатать их в конце, вот несколько простой подход, используя массивы:

 awk 'BEGIN {count=0} /mail:|fullName:|uid:/ {s[count] = s[count] ", " $0} /uid:/ {count++} END {for (i=0; i<count; i++) print substr(s[i],3)}' dump2.txt 

Если вы хотите иметь возможность обрабатывать поля отдельно (в конце), используйте двумерный массив:

 awk 'BEGIN {count=0} /mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++} END {for (i=0; i<count; i++) printf "%s, %s, %s\n", s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt 

(Как и ответ Гленна, это предполагает, что строки mail: fullName: и uid: появляются как первое поле в строке.)

Я не знаю, что вы имели в виду, когда упоминали выравнивание, но отсюда легко выстроить поля в вашем представлении:

 awk 'BEGIN {count=0} /mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++} END {for (i=0; i<count; i++) printf "%23s, %23s, %s\n", s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt 

       mail: bogus@bogus.com, fullName: Bogus Bogus, uid: 666
      mail: bogus2@bogus.com, fullName: Bogus2 Bogus2, uid: 667
    

или

 awk 'BEGIN {count=0} /mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++} END {for (i=0; i<count; i++) printf "%-23s, %-23s, %s\n", s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt 

     mail: bogus@bogus.com, fullName: Bogus Bogus, uid: 666
     mail: bogus2@bogus.com, fullName: Bogus2 Bogus2, uid: 667
    

или

 awk 'BEGIN {count=0} /mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++} END {for (i=0; i<count; i++) printf "%-23s %-24s %s\n", s[i]["mail:"] ",", s[i]["fullName:"] ",", s[i]["uid:"]}' dump2.txt 

     mail: bogus@bogus.com, fullName: Bogus Bogus, uid: 666
     mail: bogus2@bogus.com, fullName: Bogus2 Bogus2, uid: 667
    

Этот ответ показывает, как вы можете определить максимальную длину данных для каждого поля.