#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|
Комментариев нет:
Отправить комментарий