Печать значения из одного столбца в другой между двумя файлами на основе шаблонов в каждой строке

Скорее всего, при работе под cron соединение было закрыто до того, как удаленный сервер успел выдать свой баннер. Это потому, что openssl s_client управляет двунаправленным соединением между своим stdio и сокетом с удаленным сервером:

  • Он копирует stdin в сокет
  • Он копирует данные, полученные из сокета, в stdout

При запуске под cron первая копия немедленно завершает работу, потому что стандартный ввод подключен к / dev / null . Это привело к немедленному завершению работы openssl .

Вы можете смягчить это, перенаправив ввод openssl во что-то, что блокирует навсегда, или, что еще лучше, что-то вроде sleep 1 , что устранит необходимость в timeout .

Тем не менее, ожидание в одну секунду - особенно хрупкий способ подключиться и дождаться баннера. Это не только довольно короткий тайм-аут, но он даже не приводит к тому, что команда завершается раньше истечения тайм-аута при получении баннера. Для чего-то вроде этого вы ищете expect .


Между прочим:

Другие, вероятно, не согласятся, но я считаю, что вы используете термин «консоль» в этом вопросе неточно. Фактически, вы получите поведение, которое вы впервые описали в любом сеансе терминала, который может быть, среди прочего,

  • сеансом терминала ssh,
  • эмулятором терминала (например, xterm или современные замены) в вашем графическом интерфейсе
  • экран окно,
  • последовательное модемное соединение,
  • или фактическая системная консоль.

Я считаю, что термин «консоль» должен относиться исключительно к последнему, но все это терминальные сеансы.

1
09.03.2017, 09:51
3 ответа

Этого должно быть достаточно в 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) для более красивого вида вывода.

1
27.01.2020, 23:19

Это то, для чего было создано 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 .

2
27.01.2020, 23:19
perl -lane '
 if ( @ARGV == 1 ) {
  $h{ $F[0] } = $F[1];
 } else {
  print "$_ $h{ $F[1] }";
 }
' file1 file2
1
27.01.2020, 23:19

Теги

Похожие вопросы