Я пытаюсь распечатать собранные данные из файла, где каждый набор получает новую строку (\ 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
Этот ответ показывает, как вы можете определить максимальную длину данных для каждого поля.