Содержимое пакетов -dev, -bin и т. д. полностью условно, менеджер пакетов на самом деле не заботится об этом. Если вы на самом деле загружали в архив Ubuntu (или Debian ), различные инструменты (и люди )могли бы проверить, соблюдаются ли соглашения, но для локальных пакетов вам не нужно следовать им, если ты не хочешь. Тем не менее, часто есть веская причина следовать им — уменьшить путаницу, если не что иное.
Тем не менее, различные заголовки взаимосвязей между пакетами (Depends, Breaks и т. д. )поддерживают все версии; если вы правильно объявите отношения, менеджер пакетов должен помешать вам установить несовместимый набор. Даже не похоже, что вам нужны версии; только то, что libel -dev должен зависеть :от libel2 -bin, а libel2 -bin должен конфликтовать :libel1 -bin (, если они не совместимы -с возможностью установки ).
Вам могут быть полезны Руководства по политике Debian «Объявление взаимосвязей между пакетами» .
Сawk
:
awk -F'|' -v OFS='|' '{if($3=="")$3=$2}1'
Простой sed
, если второй столбец всегда является числом:
sed -E "s/([0-9]*)\|$/\1|\1/"
Использование awk
и замена 3-го поля вторым, если 3-е поле не содержит не -пустых символов:
$ awk -F '|' 'BEGIN { OFS = FS } $3 !~ /[^[:blank:]]/ { $3 = $2 }; 1' file
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401
Использование sed
для вставки номера 2-го поля, если 3-е поле пусто или содержит только пробелы:
$ sed 's/\([[:digit:]]\{1,\}\)|[[:blank:]]*$/\1|\1/' file
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401
Заметив, что 3-е поле кажется всегда таким же, как и 2-е поле, мы также можем игнорировать проверку 3-го поля на что-либо и просто установить для него значение 2-го поля.
Во-первых, сawk
:
$ awk -F '|' 'BEGIN { OFS = FS } { $3 = $2 }; 1' file
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401
или даже
$ awk -F '|' 'BEGIN { OFS = FS } { print NR, $2, $2 }' file
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401
, который также воссоздает 1-й столбец.
Затем с помощьюsed
:
$ sed 's/|[^|]*$//; s/[[:digit:]]\{1,\}$/&|&/' file
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401
Эта команда sed
сначала удаляет последнее поле, а затем воссоздает его из поля, предшествующего удаленному полю.
Или что-то вроде
$ cut -d '|' -f 2 file | sed '=; s/.*/&|&/' | sed 'N; y/\n/|/'
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401
, который извлекает второе поле данных с помощью cut
, затем использует =
в sed
для перечисления строк и создания дублирования полей, а затем, наконец, прикрепляет номера строк к данным с правильным разделитель.
Вы также можете сделать это с помощью комбинации cut
и paste
в оболочке типаbash
(с заменой процесса):
$ paste -d '|' <( cut -d '|' -f 1,2 file ) <( cut -d '|' -f 2 file )
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401
С помощью awk
, чтобы увидеть, пусто ли $3
(или нет):
awk -F'|' -v OFS='|' '$3 == "" {$3=$2} 1' file
1|100437251|100437251
2|51414204|51414204
3|111651604|111651604
4|8321737|8321737
5|27263401|27263401
awk -F'|' -v OFS='|' 'length($3) == 0 {$3=$2} 1' file