Используя ваш file1.txt
, как указано выше, и отредактированную версию вашего file2.txt
(, так что в файле 2.txt есть несколько входных строк, где $5 находится в файле 1.txt):
AL157931.1 13 23551994 23552136 ENSG00000237491
HMGA1P6 13 23708313 23708703 ENSG00000230092
RNY3P4 13 23726725 23726825 ENSG00000207157
Читая file2.txt до file1.txt, мы можем получить следующий результат:
$ awk 'BEGIN {FS=OFS="\t"}
NR==FNR {a[$5]=$1; next};
$1 in a {$1=a[$1];print}' file2.txt file1.txt
AL157931.1 1 714150 745440 2 1 143562
HMGA1P6 1 736259 745541 2 1 143562
Ключом к тому, как это работает, является понимание того, что мы хотим построить ассоциативный массив, в котором ключами являются $5 из файла2, а значениями являются $1 из того же файла.
Затем, когда мы перебираем файл1, проверяем, является ли $1 ключом в массиве. Если это так, замените $1 совпадающим значением (, то есть соответствующим $1 из файла2 ), и напечатайте строку.
Просто для упрощения то, что вы видите, является нормальным выводом, когда вы запускаете команду в фоновом режиме(&
символ ). То же самое можно увидеть, если запустить эту упрощенную версию :
ls &
Чтобы не видеть этот вывод, вы можете заключить команду в круглые скобки:
(ls &)
Или, в вашем случае
(xdotool type "$(sed -n 1p file)" &)
В вашем конкретном случае кажется, что вам не нужен &
, поэтому может быть проще удалить его из вашей команды:
xdotool type "$(sed -n 1p file)"
ПС
Если вы хотите запустить весь файл последовательно от начала до конца, вы можете сделать что-то вроде
x=0
, а затем для каждой строки запустите
x=$((x+1)); (xdotool type "$(sed -n "${x}p" file)" &)
Таким образом, вам не нужно каждый раз изменять номер.
Также взгляните на это :Как интерактивно запускать все команды в файле