Скорее всего, при работе под cron
соединение было закрыто до того, как удаленный сервер успел выдать свой баннер. Это потому, что openssl s_client
управляет двунаправленным соединением между своим stdio и сокетом с удаленным сервером:
При запуске под cron
первая копия немедленно завершает работу, потому что стандартный ввод подключен к / dev / null
. Это привело к немедленному завершению работы openssl
.
Вы можете смягчить это, перенаправив ввод openssl
во что-то, что блокирует навсегда, или, что еще лучше, что-то вроде sleep 1
, что устранит необходимость в timeout
.
Тем не менее, ожидание в одну секунду - особенно хрупкий способ подключиться и дождаться баннера. Это не только довольно короткий тайм-аут, но он даже не приводит к тому, что команда завершается раньше истечения тайм-аута при получении баннера. Для чего-то вроде этого вы ищете expect
.
Между прочим:
Другие, вероятно, не согласятся, но я считаю, что вы используете термин «консоль» в этом вопросе неточно. Фактически, вы получите поведение, которое вы впервые описали в любом сеансе терминала, который может быть, среди прочего,
xterm
или современные замены) в вашем графическом интерфейсе экран
окно, Я считаю, что термин «консоль» должен относиться исключительно к последнему, но все это терминальные сеансы.
Этого должно быть достаточно в awk:
awk 'NR==FNR{a[$1]=$2;next}{print $0,a[$2]}' file1 file2
Ваши файлы примеров представлены разделенными пробелами, и приведенный выше код будет работать для файлов, разделенных пробелами.
Если ваш file1 file2 разделен запятыми, вы можете сделать:
awk 'BEGIN{FS=OFS=","}NR==FNR{a[$1]=$2;next}{print $0,a[$2]}' file1 file2
PS: В awk FS соответствует разделителю входного поля, а OFS - разделителю выходного поля. По умолчанию FS и OFS - "пробел" и могут быть опущены, если в вашем случае пробел (т.е. опущен в самом первом коде)
Если вы хотите объединить другой разделитель поля ввода и другой разделитель поля вывода, вы можете сделать что-то вроде это:
awk 'BEGIN{FS=" ";OFS=","}NR==FNR{a[$1]=$2;next};$1=$1{print $0,a[$2]}' file1 file2
#The $1=$1 part is required to redisign the record according to the different Output Field Separator OFS
Последний код для входных файлов, разделенных пробелами (как точно указано в вашем вопросе), и вывод с разделением запятыми предоставят:
group1,pathway1,2,3
group1,pathway4,5,6
group1,pathway2,3,4
group2,pathway2,1,4
group2,pathway3,2,5
Протестируйте его онлайн здесь.
PS: Для файлов, разделенных пробелами, вы можете назначить OFS = "\ t"
(tab) для более красивого вида вывода.
Это то, для чего было создано join
:
$ join -o 1.1,1.2,1.3,2.2 -12 -21 <(sort -k2 file2) <(sort file1)
group1 pathway1 2 3
group2 pathway2 1 4
group1 pathway2 3 4
group2 pathway3 2 5
group1 pathway4 5 6
Или, если ваши входные файлы на самом деле разделены запятыми, как вы предлагаете, но не отображаются в вашем вопросе:
$ join -t, -o 1.1,1.2,1.3,2.2 -12 -21 <(sort -t, -k2 file2) <(sort file1)
group1,pathway1,2,3
group2,pathway2,1,4
group1,pathway2,3,4
group2,pathway3,2,5
group1,pathway4,5,6
join
объединит строки двух файлов в общее поле. -o
устанавливает выходной формат. Здесь я говорю ему напечатать поля 1, 2 и 3 первого файла ( 1.1,1.2,1.3
), за которыми следует второе поле второго файла ( 2.2
). -1
и -2
задают поле соединения в каждом файле. Итак, -12 -21
означает «объединить второе поле файла file1 и первое поле file2». Наконец, join
требует отсортированного ввода, поэтому мы сортируем оба файла перед их передачей в join
.
perl -lane '
if ( @ARGV == 1 ) {
$h{ $F[0] } = $F[1];
} else {
print "$_ $h{ $F[1] }";
}
' file1 file2