замените шаблон в файле 2 на шаблон в файле 1, если встречаются непредвиденные обстоятельства - PullRequest
0 голосов
/ 21 января 2019

У меня есть два файла данных с разделителями табуляции, на которых file1 выглядит так:

cluster_j_72    cluster-32  cluster-32  cluster_j_72
cluster_j_75    cluster-33  cluster-33  cluster_j_73
cluster_j_8 cluster-68  cluster-68  cluster_j_8

файл2 выглядит так:

   NODE_148        67545   97045   cluster-32
   NODE_221        1       42205   cluster-33
   NODE_168        1       24506   cluster-68

Я хотел бы подтвердить, что для данной строки в file1 столбцы 2 и 3; а также 1 и 4 идентичны. Если это так, то я хотел бы взять значение для этой строки из столбца 2 (файл 1), найти его в файле 2 и заменить его значением из столбца 1 (файл 1). Таким образом, новый вывод файла 2 будет выглядеть следующим образом (обратите внимание, что столбцы 1 и 4 не соответствуют кластеру 33 (файл1), шаблон не заменяется в файле 2):

   NODE_148        67545   97045   cluster_j_72  
   NODE_221        1       42205   cluster-33  
   NODE_168        1       24506   cluster_j_8  

Мне удалось исправить непредвиденные обстоятельства (здесь выводится значение из файла file1, которое я хотел бы использовать для замены значения в файле file2):

    awk '{if($2==$3 && $1==$4){print $1}}'file1

Если бы я мог получить sed для извлечения значений ($ 2 и $ 1) из file1 при поиске в файле 2, это сработало бы:

     sed 's/$2(from file1)/$1(from file1)/' file2

Но мне кажется, что я не могу вложить этот sed в предыдущем выражении awk и не получить sed для поиска шаблона, созданного в другом файле, а не в нем.

спасибо!

1 Ответ

0 голосов
/ 21 января 2019

Вам никогда не понадобится sed, когда вы используете awk, поскольку awk может делать все, что умеет sed.

Возможно, это то, что вы пытаетесь сделать:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR==FNR {
    if ( ($1 == $4) && ($2 == $3) ) {
        map[$2] = $1
    }
    next
}
$4 in map { $4 = map[$4] }
{ print }

$ awk -f tst.awk file1 file2
NODE_148        67545   97045   cluster_j_72
NODE_221        1       42205   cluster-33
NODE_168        1       24506   cluster_j_8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...