Насколько я могу сказать execi
должен работать, не уверенный, почему это не делает. В любом случае я добираюсь conky
показать мой общедоступный IP следующим образом:
${texeci 3600 wget -qO - http://cfajohnson.com/ipaddr.cgi}
Попытайтесь заменить execi
с texeci
, посмотрите, помогает ли это.
Другая возможная проблема - это conky
может быть загружен, прежде чем Ваше соединение устанавливается. Если так, это выполнит Ваш execi
команда на запуске, но это не получит результата, так как Вы еще не соединены. Я обхожу этот тип проблемы путем запуска conky
через сценарий обертки, который похож на это:
#!/bin/bash
sleep 20
conky
Это звучит как задача для Присоединиться
:
join -t":" -o "1.1,1.2,1.3,1.4,1.5,2.1,2.2,2.3" \
-j 2 <(sort -k2,2 -t: test1) <(sort -k2,2 -t: test2)
join -t":" -o "1.1,1.2,1.3,1.4,1.5,2.1,2.2,2.3" \
-j 2 <(sort -k2,2 -t: test1) <(sort -k2,2 -t: test2)
Julian:Brude:Other:Other:Other:Jb:Brude:kemin
Robert:Dillain:Other:Other:Other:R:Dillain:bodent
Megan:Flikk:Other:Other:Other:Mb:Flikk:kentin
Jesus:Kimmel:Other:Other:Other:Jbb:Kimmel:verlin
Samantha:Minot:Other:Other:Other:Sb:Minot:amsen
-T
Установите разделитель поля на :
-O
Установить формат печати -J
Присоединяйтесь к номеру столбца 2
<(сортировка -K2,2 -T: файл)
Сортировать файл по -k
Второй колонн -T -T
Установите поле разделителя в :
через Python3
#!/usr/bin/python3
import csv
import sys
file1, file2 = sys.argv[1], sys.argv[2]
with open(file2) as second, open(file1) as first:
second_list = second.readlines()
first_list = first.readlines()
for line1 in first_list:
for line2 in second_list:
if line1.split(':')[1] == line2.split(':')[1]:
print(line1.strip()+line2.strip())
Копировать и вставить вышеуказанный скрипт в файл, называемый Script.py
. А затем запустите скрипт, запустив следующую команду на терминале.
python3 script.py file1 file2
Это простую задачу для AWK
:
awk -F':' -vOFS=':' 'NR==FNR{a[$2]=$0;next}{print $0,a[$2]}' file2 file1
Сначала мы устанавливаем :
: в качестве сепаратора поля для ввода (с -F
) и вывод (с ofS
), затем, если первый файл обрабатывается ( file2
) Мы назначаем целую строку к элементу таблицы, проиндексированному со вторым полем. Когда следующий следующий файл ( file1
обрабатывается, мы распечатываем его строки, добавляющие строку из предыдущего файла, хранящегося в A [2] [$ 2]
).
С помощью sed
вы, вероятно, сможете сделать:
sed 's|[^:]*:\([^:]*\).*|/^[^:]*:\1:/s/$/:&/;t|' file2 | sed -f - file1
... что потребует от одного процесса sed
чтения второго файла и написания сценария sed
для редактирование первого во второй sed
stdin. Насколько я могу судить, у вас не должно возникнуть проблем с прямым вводом содержимого в такое регулярное выражение. Если есть возможность ввода метасимволов, на этом сайте есть множество ответов, в которых обсуждаются способы их экранирования. Однако, если это может потребоваться, следующего будет достаточно:
sed 's|[]&\./*[]|\\&|g;s|...' ... | sed -f - file1
Тем не менее, вероятно, одноименное join
- лучшее решение - это просто демонстрация того, как это сделать с sed
, потому что вы это упомянули.
В любом случае, сценарий, который второй sed
применяет к file1
, в итоге выглядит как (со строкой, подобной приведенной ниже, для каждой строки в file2) :
/^[^:]*:Dillain:/s/$/:R:Dillain:bodent/;t
... что означает, что если он обнаруживает строку, совпадающую с Dillain для второго поля, разделенного двоеточиями, то он должен добавить строку : R: Dillain: bodent в его хвост. Поскольку, вероятно, нет смысла продолжать попытки сопоставить строку в file1
, если строка из file2
уже была добавлена, завершающая команда t
est просто ветвится отменить любую успешную замену, как только она будет завершена.