Ваша проблема заключается в том, что вы затираете выходной файл на каждой итерации цикла, оставляя только самые последние изменения в output
и ни одно из более ранних.
Вместо этого вы можете легко преобразовать файл template
в набор команд sed
:
$ awk '{ printf("s/%s/%s/g\n", $1, $2) }' template
s/MSTRG.1/AT1G01030/g
s/MSTRG.2/AT1G01010/g
s/MSTRG.3/AT1G01035/g
... а затем примените их к своему файлу:
$ awk '{ printf("s/%s/%s/g\n", $1, $2) }' template | sed -f - input
gene_id "AT1G01030";
gene_id "AT1G01030";
gene_id "AT1G01010";
gene_id "AT1G01035";
Некоторые реализации sed
не распознают -
как стандартный ввод. Чтобы использовать этот подход с таким sed
, замените -f -
на -f /dev/stdin
.
Или вы можете просто сделать все это вawk
:
$ awk 'FNR == NR { pat[$1] = $2; next } { for (p in pat) gsub(p, pat[p]); print }' template input
gene_id "AT1G01030";
gene_id "AT1G01030";
gene_id "AT1G01010";
gene_id "AT1G01035";
Обратите внимание, что во всех приведенных выше вариантах используется то, что находится в первом столбце template
в качестве регулярного выражения , что означает, что.
(точка )будет соответствовать любому персонаж.
Решено, я удалил все двойные пробелы (и дополнительные пробелы )из этого файла:
/etc/apt/sources.list.d/official-package-repositories.list
Я вспомнил, что отредактировал его по своему вкусу, добавив больше пробелов для выравнивания столбцов. А также объединить некоторые записи.
Эти комбинации, очевидно, не имеют значения, но дополнительные пробелы действуют от (до mintsources
, а неapt
).
В итоге это выглядит так:
deb http://packages.linuxmint.com ulyana main upstream import backport
deb http://archive.ubuntu.com/ubuntu focal main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu focal-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu focal-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu focal-security main restricted universe multiverse
deb http://archive.canonical.com/ubuntu focal partner
После этого я могу запустить mintsources
и как обычный пользователь, и как root.