Объединить две строки в строку, где | разделитель

Я смог взять на себя вашу команду и сколотить это воедино:

df -Ph | awk 'int($5) > 90 {print $0; rc=1}; END {exit rc}' || mail -s "Disk Space Alert On $(hostname)" douglas.hayes@whatever.org

Я избавился от sed, так как с awkон не нужен. В операторе awkя устанавливаю ненулевой код возврата, отличный от -, если он находит какие-либо перечисленные разделы более 90%, а затем отправляю электронное письмо только в том случае, если возврат был не нулевым -.

Единственное предостережение, о котором я мог подумать, это то, что awkможет завершиться с ошибкой, и вы все равно получите электронное письмо, но, возможно, это желательное уведомление.

0
20.10.2021, 07:47
3 ответа

Предположим, что ваши данные содержат поля, разделенные |, и что символы-разделители |могут содержать пробелы с обеих сторон. Тогда разделителем полей ввода, который вы должны использовать с awk, является выражение *[|] *, то есть выражение, соответствующее символу |и любым пробелам по бокам.

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

awk -F ' *[|] *' -v OFS='|' '{ $1=$1 }; 1' file

или, что то же самое,

awk -F ' *[|] *' -v OFS='|' '{ $1=$1; print }' file

Тестирование:

$ cat file
XXXXXXXX 0 Xxyxhsag | yuiji
$ awk -F ' *[|] *' -v OFS='|' '{ $1=$1 }; 1' file
XXXXXXXX 0 Xxyxhsag|yuiji

Вы также можете использовать замену в sedс аналогичным выражением:

$ sed 's/ *| */|/g' file
XXXXXXXX 0 Xxyxhsag|yuiji

Все это предполагает, что мы можем обрабатывать данные как текст или как «простые» данные CSV, без разделителей, новых строк или кавычек, встроенных в поля в кавычках.

3
20.10.2021, 09:18

заданные входные данные,

XXXXXXXX 0 Xxyxhsag | one
XXXXXXXX 0 Xxyxhsag     |     two
XXXXXXXX 0 Xxyxhsag|third

разделитель по умолчанию

использовать разделитель по умолчанию awk(один или несколько пробелов подряд или табуляцию ),

awk '{print $1,$2,$3$4$5}' v
XXXXXXXX 0 Xxyxhsag|one
XXXXXXXX 0 Xxyxhsag|two
XXXXXXXX 0 Xxyxhsag|third

обратите внимание на изменение 3-го поля

awk '{printf "3th:[%s]\n",$3}' v
3th:[Xxyxhsag]
3th:[Xxyxhsag]
3th:[Xxyxhsag|third]

Это может быть решением, если у вас всегда есть 5 полей в вашем реальном случае.

труба (| )сепаратор

вы можете использовать |в качестве разделителя, но это сохранит место в полях

awk -F\| '{printf "%s|%s\n", $1, $2}' v
XXXXXXXX 0 Xxyxhsag | one
XXXXXXXX 0 Xxyxhsag     |     two
XXXXXXXX 0 Xxyxhsag|third

это может быть более явным, если я изменю разделитель вывода на!

awk -F\| '{printf "%s!%s\n", $1, $2}' v
XXXXXXXX 0 Xxyxhsag ! one
XXXXXXXX 0 Xxyxhsag     !     two
XXXXXXXX 0 Xxyxhsag!third

Теперь у вас не так много выигрыша, так как вам нужно удалить пробелы в конце $1и начальные пробелы в $2.

0
20.10.2021, 09:00

с awkможно попробовать:

awk -F'|' -v OFS='|' '{sub(/ \| /,"|")} 1' file
XXXXXXXX 0 Xxyxhsag|yuiji
  • устанавливаем FS и OFS (одинаковое значение:|)
  • только при этом мы имеем этот результат:
awk -F'|' -v OFS='|' '1' file
XXXXXXXX 0 Xxyxhsag | yuiji
  • поэтому мы удаляем пробелы слева и справа от |, используяsub():
{sub(/ \| /,"|")}
0
20.10.2021, 10:17

Теги

Похожие вопросы