Вот еще один способ с помощью join
:
join -1 1 -2 2 -o 0 2.1 <(sort -k1,1 file1.txt) <(cut -d ' ' -f1 1.txt 2.txt | sort | uniq -c)
обратите внимание, что вывод будет отсортирован:
get 1
move 2
put 1
Если вы хотите сохранить порядок из file1.txt
, например,
move 2
get 1
put 1
вы можете запустить:
join -j2 -o 1.1 0 2.1 <(nl -ba -nrz file1.txt | sort -k2,2) \
<(cut -d ' ' -f1 1.txt 2.txt | sort | uniq -c) | sort -k1 | cut -d ' ' -f2-
Вы не можете. В исходном коде для expect-5.45.4
мы находим в exp_main_sub.c
в строке 711
case 'c': /* command */
exp_cmdlinecmds = TRUE;
rc = Tcl_Eval(interp,optarg);
...
, который обрабатывает код -c
. $argv
и друзья создаются только после того, как -c
eval завершится в строке 850 и далее
/* collect remaining args and make into argc, argv0, and argv */
sprintf(argc_rep,"%d",argc-optind);
Tcl_SetVar(interp,"argc",argc_rep,0);
expDiagLog("set argc %s\r\n",argc_rep);
...
Tcl_SetVar(interp,"argv",args,0);
, поэтому $argv
абсолютно не существует, когда выполняется код -c
.
Одно из обходных решений: Запустить локальный сценарий ожидания на удаленном сервере? , что влечет за собой передачу кода TCL на стандартный ввод и последующее чтение в expect
файла/dev/stdin
$ echo puts \[lindex \$argv 1\] | expect /dev/stdin blee bla blu
bla
Другой обходной путь — выбросить оболочку и написать все это на TCL
#!/usr/bin/env expect
set FILE [lindex $argv 0]
set HOST [lindex $argv 1]
...
А потом chmod +x
это и запустить
./whatyoucalledtheabove somefile somehost
Он должен содержать все, что делает ваш текущий сценарий оболочки выше вызова expect
...