API disable|enable нестабилен и может измениться в будущем. Я предлагаю вам использовать следующую команду для удаления всех символических ссылок в /etc/rc?.d/:
update-rc.d -f tomcat remove
В сценарии python:
Прагматическое решение
В случае, если это одноразовая работа, характерная для одной ситуации, следующие работы:
[ f1]Выход:
Neeraj:149:neeraj@xyz.com
Rahul:148:rahul@gmail.com
Tarun:143:tarun@gmail.com
Или, если вы хотите сохранить вывод непосредственно в файл:
#!/usr/bin/env python3
with open(file1) as names:
names = sorted(names.readlines())
with open(file2) as data:
data = data.readlines()
with open(file3, "wt") as output:
for i in names:
output.write(i.replace("\n", "")+str([d[d.find(":"):].replace("\n", "") for d in data if d.startswith(i.split(":")[0])][0])+"\n")
Как вы, вероятно, знаете, скопируйте сценарий в пустым файлом, установите путь к файлу 1-2 (3) (между кавычками), сохраните его как combine.py, запустите его командой:
python3 /path/to/combine.py
Прагматическое решение
Глядя на два файла, мы имеем дело с базами данных, причем первое поле является ключевым. Следующий сценарий более гибкий и охватывает более гибкий способ создания отчетов о двух файлах (например, в ситуациях), где у нас будет больше полей, чем здесь.
Если мы добавим extra («characterizing») ко второму файлу:
Neeraj:neeraj@xyz.com:Loves to Cook
Rahul:rahul@gmail.com:Collects empty bottles
Tarun:tarun@gmail.com:Weares his glasses upside down
Мы могли бы захотеть добавить описание вместо адреса электронной почты или и то, и другое. Это потребует сценарий вроде:
#!/usr/bin/env python3
db1 = "/path/to/file1"; db2 = "/path/to/file2"
with open(db1) as data1:
rc = [l.replace("\n", "").split(":") for l in data1.readlines()]
with open(db2) as data2:
records2 = [l.replace("\n", "").split(":") for l in data2.readlines()]
uniques = sorted(set(item[0] for item in rc)) # find keys
report = []
for i in uniques:
database_1 = [r for r in rc if r[0] == i][0]
database_2 = [r for r in records2 if r[0] == i][0]
# -----------------------------------------------------------------------
# set the required fields for report here:
new_record = i, database_1[1], database_2[1]
# -----------------------------------------------------------------------
report.append((":").join(new_record))
for item in report:
print(item)
Результат
Если мы установим:
new_record = i, database_1[1], database_2[2]
Результат:
Neeraj:149:Loves to Cook
Rahul:148:Collects empty bottles
Tarun:143:Weares his glasses upside down
Но если мы установим:
new_record = i, database_1[1], database_2[1]
Результат:
Neeraj:149:neeraj@xyz.com
Rahul:148:rahul@gmail.com
Tarun:143:tarun@gmail.com
И если мы установим:
new_record = i, database_1[1], database_2[1], database_2[2]
Результат есть:
Neeraj:149:neeraj@xyz.com:Loves to Cook
Rahul:148:rahul@gmail.com:Collects empty bottles
Tarun:143:tarun@gmail.com:Weares his glasses upside down
С заменой процесса в bash мы можем сделать очень компактный вариант решения join даже для несортированных входных файлов:
join -t: <(sort user-name) <(sort user-details)
Выходной сигнал точно так же, как в примере, выводимом в вопросе:
Neeraj:149:neeraj@xyz.com
Rahul:148:rahul@gmail.com
Tarun:143:tarun@gmail.com
Здесь мы используем первое поле / столбец обоих файлов. Для использования других столбцов используйте опции -1 и -2 (или -j, если это одно и то же поле). Чтобы быть более явным, мы могли бы использовать join -t: -j 1 ... или join -t: -1 1 -2 1 ... выше. (См. Также man join)
Части формы <(command) заменены именованным каналом, из которого можно считывать вывод команды. Это означает, что для команды join в качестве аргументов он получает два файла со отсортированным вводом.
(См. [F13])
Вот решение awk:
$ awk -F: -v OFS=: 'NR==FNR{a[$1]=$2; next}{print $1,a[$1],$2}' user-name user-details
Tarun:143:tarun@gmail.com
Neeraj:149:neeraj@xyz.com
Rahul:148:rahul@gmail.com
Попробуйте с моим кодом:
Сначала соберите оба user-name и contacts и напишите вывод в один файл с именем user-name_contacts с помощью этого:
sort user-name contacts > user-name_contacts
Next , запустите эту команду, чтобы присоединиться к двум файлам:
sed -i '/$/N ; s/\n\(.*\):/:/' user-name_contacts
Выход:
Neeraj:149:neeraj@xyz.com Rahul:148:rahul@gmail.com Tarun:143:tarun@gmail.com