Страницы

Поиск по вопросам

четверг, 28 марта 2019 г.

Как переформатировать текст средствами bash?

Добрый день, есть файл с таким содержимым:
name1 PoweredOff 192.168.250.31 Debian GNU/Linux 6 (64-bit) Other 2.6.x Linux (64-bit)
name2 PoweredOn 192.168.250.99 Debian GNU/Linux 6 (64-bit) Other 3.x Linux (64-bit)
Нужно привести его к виду:
|name1|PoweredOff|192.168.250.31|Debian GNU/Linux 6 (64-bit)|Other 2.6.x Linux 64-bit)| |name2|PoweredOn|192.168.250.99|Debian GNU/Linux 6 (64-bit)|Other 3.x Linux (64-bit)|
Пытался делать подобное:
IFS=$'
'; for i in $(cat file); do if [[ -n $i ]]; then tr -s '
' ' '; fi; done
но это не работает


Ответ

При помощи awk:
awk -vRS='' -vFS='
' -vOFS='|' '{$1=$1;print "",$0,""}' < data.txt
Переменная RS задает разделитель между записями (пустая строка), FS - разделитель полей внутри записи (перевод строки). Любая команда, изменяющая любое поле (в данном случае $1=$1) неявно пересобирает запись ($0), используя в качестве разделителя значение OFS.
UPD: изменил для произвольного числа строк в записи.

Комментариев нет:

Отправить комментарий