Страницы

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

вторник, 28 января 2020 г.

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

#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=$'\n'; for i in $(cat file); do if [[ -n $i ]]; then tr -s '\n' ' '; fi; done


но это не работает
    


Ответы

Ответ 1



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

Ответ 2



На bash, как-то так: #!/bin/bash out="" while read s do if [ "$s" = "" ]; then [ "$out" = "" ] || echo "$out|" out="" else out="$out|$s" fi done [ "$out" = "" ] || echo "$out|" Несколько пустых строк считает за одну, а также не зависит от числа строк в блоке (параграфе). avp@wubu:hashcode$ ./tt.sh

Ответ 3



средствами программы bash это будет довольно затруднительно, хотя и возможно. гораздо проще вопспользоваться более подходящими программами: awk, sed и т.п. пример для программы awk уже дали. вот пример для программы sed: $ sed '/^$/d;N;N;N;N;s/\n/|/g;s/^/|/;s/$/|/' файл результат: |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)| обновление если количество строк в блоках текста, разделённых пустой строкой, постоянное, то вышеприведённую программу для интерпретатора sed можно подстраивать, изменяя количество операторов N;. если же количество строк переменное, то программу придётся немного усложнить (тут, вероятно, много лишнего, и можно соптимизировать): $ sed '/^$/d;:a;$!N;s/\n$/|/;tb;s/\n/|/;ta;:b;s/^/|/;$s/$/|/' файл когда файл содержит такие строки: name1 PoweredOff 192.168.250.31 Debian GNU/Linux 6 (64-bit) name2 PoweredOn 192.168.250.99 то вывод программы будет такой: |name1|PoweredOff|192.168.250.31|Debian GNU/Linux 6 (64-bit)| |name2|PoweredOn|192.168.250.99|

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

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