Слияние в Unix

Вы пробовали Teamviewer для Linux? http://www.teamviewer.com/en/download/linux.aspx Это бесплатно для некоммерческого использования. Я использую его для своего сервера WebDAV Debian 6 без серьезных проблем и получить такой же рабочий стол, как если бы я сидел за самим Debian ...

1
10.10.2018, 20:19
3 ответа

С GNU sed:

sed ':loop /\(.*|\)\{4\}.*/ !{N; s/\n//; b loop}; s/ *| */|/g' file

Команда рассекла:

:loop

:обозначает метку, которую мы можем использовать для ветвей. «петля» — это просто название, которое я выбрал для ярлыка.

/\(.*|\)\{4\}.*/

Является регулярным выражением селектора строк, которое соответствует строкам, содержащим 4 символа вертикальной черты, каждой из которых может предшествовать ноль или более произвольных символов (.*|), при этом за последней вертикальной чертой может следовать ноль или более произвольных символов.

!{... }

Применяет команды в скобках к любой строке, которая не соответствует предыдущему регулярному выражению.

N; s/\n//; b loop

Nобъединяет текущую строку в пространстве шаблонов с символом новой строки и следующей строкой из исходного файла, затем s/\n//удаляет символ новой строки и b loopвыполняет возврат к метке, которую мы определили в начало, поэтому объединенная строка будет снова сравниваться с регулярным выражением.

Наконец

s/ *| */|/g

будет применяться к любой строке в пространстве шаблонов до ее вывода. Это удаляет все пробелы вокруг символов вертикальной черты.

2
27.01.2020, 23:31

Я предполагаю, что вам не нужны все эти пустые строки.

$ cat file
1|abc|def|ghi|
4|ijk|
|lmn|
5||opq|rst|
8|
uvw||xyz|
10|hjg|jsh|nbm|

$ awk -F'|' '{while (NF < 5) {getline nextline; $0 = $0 nextline}}1' file
1|abc|def|ghi|
4|ijk||lmn|
5||opq|rst|
8|uvw||xyz|
10|hjg|jsh|nbm|

Обновление для редактирования вопроса :удаление пробелов вокруг разделителя полей

awk -F'[[:blank:]]*[|][[:blank:]]*' -v OFS='|' '
    {while (NF < 5) {getline nextline; $0 = $0 nextline}; $1=$1; print} 
' file
1
27.01.2020, 23:31

Если можно использовать Vim:

vim -Nesc 'g!/\(.*|\)\{4\}$/j!' -cwq input.txt
  • -NesVim запускается в режиме сценария, что упрощает автоматизацию
  • -c...запускает команды Vim после открытия файла
  • g!/\(.*|\)\{4\}$/j!-в каждой строке :g, что не соответствует!соответствует/\(.*|\)\{4\}$/(регулярному выражению, соответствующему 4 каналам, разделенным ничем ), присоединяем к нему следующую строку(:j).
  • wq-сохранить и выйти.
0
27.01.2020, 23:31

Теги

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