Собраться последовательная строка N в оболочке?

Отключите брандмауэр, чтобы обнаружить проблему с брандмауэром или добавить правило принять UDP на порте 53. Мог также позволить TCP на порте 53. Попытайтесь сохранить привязь на изменениях конфигурации и сохранить резервное копирование всех важных конфигурационных файлов.

4
07.11.2014, 06:11
5 ответов

с SED :

sed '$!N;$!N;y/\n/:/'

Хотя я думаю, что это менее общее, чем n линии , чем должно быть. Если количество строк, которые вы хотите, всегда будут в конце поля, подобного тому, то:

sed '$q;N;/1.$/!s/\(..*\)\(\n\)/\2\1:/;//P;D
' <<\INPUT 
field1a
field1b
field2b
field1c
INPUT

Выход

field1a
field1b:field2b
field1c

... который стекирует линии после того, как это заканчивается 1 , то любой один символ до Он сталкивается с другим, заканчивающимся с 1 , чем что-то еще.

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

sed '.../[^0-9]1.$/!...'

... Если вы попадаете в несколько цифр.

2
27.01.2020, 20:45
 paste -sd '::\n' file

Или:

 awk '{ORS=NR%3?":":"\n";print}' < file

(обратите внимание на разницу, если количество записей на входе не является кратным из 3).

11
27.01.2020, 20:45

Для форматирования вывода можно использовать printf

IFS='
'       # split on sequences of newline characters
set -f # disable globbing
printf "%s:%s:%s\n" $(cat file)

(обратите внимание, что при этом пропускаются пустые строки).

Или sed (если хотите)

sed '$!N;$!N;s/\n/:/g' file
2
27.01.2020, 20:45

С помощью вставьте :

paste -d: - - - <file

Объедините файл, вставив данные в 3 столбца ( - - - ) с использованием разделителя двоеточия:

С Perl:

perl -pe 'if($.%3){s/\n/:/;}' file

с параметром -p выполняется печать по умолчанию. Все, что мы здесь делаем, это если номер строки равен модулю 3 (% 3 ), заменим символ новой строки ( \ n ) двоеточием (: ).

С помощью xargs и awk :

xargs -L 3 < file | awk '$1=$1' OFS=:

Аргумент -L в xargs сообщает, сколько строк нужно соединить. И awk помещает разделитель выходного поля (OFS) из пробела (по умолчанию) в разделитель двоеточия (: ).

С помощью awk :

awk 'NR%3{printf "%s:",$0;next}{print;}' file

Распечатайте модуль трех строк, используя printf (без новой строки) с двоеточием, и выполните обычную печать для следующей строки, используя print (которая по умолчанию помещает новую строку) .

ссылка

4
27.01.2020, 20:45

Если у меня всего несколько сотен или меньше строк, или если количество полей в группе меняется, тогда vi работает для меня очень хорошо.

В vi, если я хочу объединить текущую и следующие 2 строки (всего 3 строки текста), то ...

    3J

В этот момент мой курсор находится на объединенной строке, поэтому я перехожу к следующий ...

    j

Я делаю ту же модификацию относительно текущей строки, используя точку ...

    .

И снова ...

    j
    .

Ой! В последней группе было 4 строки, а не 3. Я отменяю последнюю модификацию ...

    u

и сделай это снова, прямо сейчас ...

    4J

Далее! ...

    j

... И так далее.

Обратите внимание: если вы собираетесь сделать это для загрузки своей базы данных с 360 миллионами полей или если ваши последовательные поля обычно 3, с несколькими группами по 4 и, возможно, редкой группой из 5 или 6, тогда вы будете возможно, вы захотите вынести загадочный синтаксис, состоящий в том, чтобы вывести себя из цикла, упорядочить данные по шагам и, возможно, написать программу, чтобы протестировать ее и предупредить вас об ошибках.

Но если это небольшая разовая работа, то я просто переношу несколько минут скуки и использую vi.

0
27.01.2020, 20:45

Теги

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