Замена совпадающих записей в одном столбце файла другим столбцом из другого файла

Зависимости по умолчанию для Пакет owncloud в Debian включает привязку php, mysql и apache, но есть альтернативы для sqlite и других веб-серверов.

Если вы сделаете:

apt install owncloud php5-sqlite nginx apache2-

, то apt заметит, что вы устанавливаете пакет nginx и php5-sqlite , решите, что они удовлетворяют зависимостям owncloud. , а не втягивают mysql или apache2. К сожалению, что-то действительно втягивает apache, поэтому мы добавляем явную инструкцию для apt, что этого не следует делать, с apache2- бит. Обратите внимание на тире («-») в конце; который сообщает apt удалить пакет или не устанавливать его, если он еще не установлен.

Кроме того, вы также можете сначала установить nginx и php5-sqlite , настроить их (при необходимости) и только , затем (после того, как вы поднял их) установите пакет owncloud .

8
05.04.2019, 15:56
3 ответа

Это очень легко сделать с помощьюawk:

$ awk 'NR==FNR{a[$1]=$2; next}{$1=a[$1]; print}' file2 file1
GCF_000014165.1_ASM1416v1_protein.faa WP_011558474.1 1155234 1156286 44173
GCF_000014165.1_ASM1416v1_protein.faa WP_011558475.1 1156298 1156807 12
GCF_000014165.1_ASM1416v1_protein.faa WP_011558476.1 1156804 1157820 -3
GCF_000015405.1_ASM1540v1_protein.faa WP_011558474.1 1159543 1160595 42748
GCF_000015405.1_ASM1540v1_protein.faa WP_011558475.1 1160607 1161116 12
GCF_000015405.1_ASM1540v1_protein.faa WP_011558476.1 1161113 1162129 -3
GCF_000016005.1_ASM1600v1_protein.faa WP_011559727.1 2481079 2481633 8
GCF_000016005.1_ASM1600v1_protein.faa WP_011854835.1 1163068 1164120 42559
GCF_000016005.1_ASM1600v1_protein.faa WP_011854836.1 1164127 1164636 7

Или, поскольку это выглядит как вкладка -разделенного файла:

$ awk -vOFS="\t" 'NR==FNR{a[$1]=$2; next}{$1=a[$1]; print}' file2 file1
GCF_000014165.1_ASM1416v1_protein.faa   WP_011558474.1  1155234 1156286 44173
GCF_000014165.1_ASM1416v1_protein.faa   WP_011558475.1  1156298 1156807 12
GCF_000014165.1_ASM1416v1_protein.faa   WP_011558476.1  1156804 1157820 -3
GCF_000015405.1_ASM1540v1_protein.faa   WP_011558474.1  1159543 1160595 42748
GCF_000015405.1_ASM1540v1_protein.faa   WP_011558475.1  1160607 1161116 12
GCF_000015405.1_ASM1540v1_protein.faa   WP_011558476.1  1161113 1162129 -3
GCF_000016005.1_ASM1600v1_protein.faa   WP_011559727.1  2481079 2481633 8
GCF_000016005.1_ASM1600v1_protein.faa   WP_011854835.1  1163068 1164120 42559
GCF_000016005.1_ASM1600v1_protein.faa   WP_011854836.1  1164127 1164636 7

Это предполагает, что каждый идентификатор RefSeq(NC_*file1имеет соответствующую запись в file2.

Пояснение

  • NR==FNR:NR — номер текущей строки, FNR — номер строки текущего файла. Они будут идентичными только во время чтения первого файла (, здесь file2).
  • a[$1]=$2; next:если это первый файл (см. выше ), сохранить 2-е поле в массиве, ключом которого является 1-е поле. Затем перейдите к строке next. Это гарантирует, что следующий блок не будет выполнен для первого файла.
  • {$1=a[$1]; print}:теперь, во втором файле, установите 1-е поле на любое значение, которое было сохранено в массиве aдля 1-го поля (, поэтому,связанное значение изfile2)и напечатайте результирующую строку.
14
27.01.2020, 20:08

Протестировано с помощью приведенной ниже команды и работает нормально

for i in `awk '{print $1}' f2`; do k=`awk -v i="$i" '$1==i {print $2}' f2`;sed  "/$i/s/$i/$k/g" f1 >f3;done

выход

for i in `awk '{print $1}' f2`; do k=`awk -v i="$i" '$1==i {print $2}' f2`;sed  "/$i/s/$i/$k/g" f1 >f3;done


GCF_000014165.1_ASM1416v1_protein.faa     WP_011558474.1  1155234 1156286 44173
GCF_000014165.1_ASM1416v1_protein.faa     WP_011558475.1  1156298 1156807 12
GCF_000014165.1_ASM1416v1_protein.faa     WP_011558476.1  1156804 1157820 -3
GCF_000015405.1_ASM1540v1_protein.faa     WP_011558474.1  1159543 1160595 42748
GCF_000015405.1_ASM1540v1_protein.faa     WP_011558475.1  1160607 1161116 12
GCF_000015405.1_ASM1540v1_protein.faa     WP_011558476.1  1161113 1162129 -3
GCF_000016005.1_ASM1600v1_protein.faa     WP_011559727.1  2481079 2481633 8
GCF_000016005.1_ASM1600v1_protein.faa     WP_011854835.1  1163068 1164120 42559
GCF_000016005.1_ASM1600v1_protein.faa     WP_011854836.1  1164127 1164636 7
0
27.01.2020, 20:08

Нет необходимости в awk, если файлы отсортированы, вы можете использовать соединение с coreutils:

join -o '2.2 1.2 1.3 1.4 1.5' file1 file2

Выход:

GCF_000014165.1_ASM1416v1_protein.faa     WP_011558474.1  1155234 1156286 44173
GCF_000014165.1_ASM1416v1_protein.faa     WP_011558475.1  1156298 1156807 12
GCF_000014165.1_ASM1416v1_protein.faa     WP_011558476.1  1156804 1157820 -3
GCF_000015405.1_ASM1540v1_protein.faa     WP_011558474.1  1159543 1160595 42748
GCF_000015405.1_ASM1540v1_protein.faa     WP_011558475.1  1160607 1161116 12
GCF_000015405.1_ASM1540v1_protein.faa     WP_011558476.1  1161113 1162129 -3
GCF_000016005.1_ASM1600v1_protein.faa     WP_011559727.1  2481079 2481633 8
GCF_000016005.1_ASM1600v1_protein.faa     WP_011854835.1  1163068 1164120 42559
GCF_000016005.1_ASM1600v1_protein.faa     WP_011854836.1  1164127 1164636 7

Если ваши файлы не отсортированы, вы можете либо сначала отсортировать их (sort file1 > file1.sorted; sort file2 > file2.sorted), а затем использовать приведенную выше команду, либо, если ваша оболочка поддерживает конструкцию <()(, bash поддерживает ), вы можете делать:

join -o '2.2 1.2 1.3 1.4 1.5' <(sort file1) <(sort file2)
17
27.01.2020, 20:08

Теги

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