В Bash (или какой-либо другой оболочке, поддерживающей $ ''
и массивы), это должно работать, если ваши входные файлы не 't contain tabs (*) :
IFS=$'\t'
paste arg1.txt arg2.txt |
while read -r -a A ; do
[ "${#A[@]}" -eq 2 ] && printf "%s - %s\n" ${A[@]}
done
paste
склеивает входные файлы построчно, read -a A
считывает столбцы в массив ] A
, используя табуляцию (из IFS
) в качестве разделителя. ["$ {# A [@]}" -eq 2]
проверяет, что в массиве ровно два члена, а $ {A [@]}
удаляет их в командной строке. из printf
. При необходимости измените команду.
(* если вам нужна поддержка вкладок, я бы перешел к использованию, например, Perl)
С этими входными файлами:
$ cat arg1.txt
foo bar
doo
$ cat arg2.txt
one
two two
three three three
Вывод из приведенного выше фрагмента:
foo bar - one
doo - two two
Последняя строка из arg2.txt
игнорируется, поскольку arg1.txt
не имеет соответствующей строки. read
игнорирует ведущие табуляции, что делает невозможным использование, если мы заботимся о том, в каких столбцах были пропущенные элементы.
Обновление из ответа Ильи (У меня нет репутации, чтобы комментировать)
У меня он работает в Ubuntu 16.04, используя предоставленную службу в качестве шаблона (, поэтому один файл службы ), изменяя две вещи:
sudo cp ~/Downloads/openvpn-2.4.8/distro/systemd/openvpn-client@.service.in /lib/systemd/system/openvpn-client@.service
sudo vi /lib/systemd/system/openvpn-client@.service
Изменить:
Перезагрузка и запуск
sudo systemctl daemon-reload
service openvpn-client@client.service restart
service openvpn-client@client.service status
Предполагается, что у вас уже есть конфигурация в /etc/openvpn/client/client.service.conf