2016-03-23 3 views
1

Я пытаюсь соответствовать $4 в file2 с частичной строки в $ 1 из file1 и поместить содержимое $2 в этом файле в $4 из file2 разделенных |. Проблема, которую я испытываю, заключается в том, что в file2 строка в $4 выглядит как ADH5_1 и ее совпадение в file1. $1 выглядит 426_238486_128(ADH5)_1_1. Я не уверен, как наилучшим образом подойти к этому. Спасибо :).частичное совпадение между файлами с использованием AWK

файл1

426_238486_128(ADH5)_1_1 70 
426_238487_128(ADH5)_2_1 50.83 
426_238488_128(ADH5)_3.1_1 46.67 

файл2

chr4 100009839 100009851 ADH5_1 
chr4 100006265 100006367 ADH5_2 
chr4 100003125 100003267 ADH5_3 

требуемый выход

chr4 100009839 100009851 ADH5_1|70 
chr4 100006265 100006367 ADH5_2|50.83 
chr4 100003125 100003267 ADH5_3|46.67 

Я знаю, что частичное MATC h в awk можно сделать, но не уверен, как сделать это по всему файлу, а не по ключевому слову, а также как форматировать строку, чтобы ее можно было правильно искать.

awk '$1 ~ /AGRN_1/ { print }' file1 

ответ

1
$ awk -v OFS='|' 'NR==FNR{split($1,t,/[_().]+/); a[t[4]"_"t[5]]=$NF; next} {print $0, a[$NF]}' file1 file2 
chr4 100009839 100009851 ADH5_1|70 
chr4 100006265 100006367 ADH5_2|50.83 
chr4 100003125 100003267 ADH5_3|46.67 
+1

Спасибо всем, отлично работает :). – Chris

1

Вы можете использовать сценарий AWK, как это (проверено с GNU Awk):

FNR==NR { # file 1 
    # extract key from $1 
    k = gensub(/^.*\(([^)]+)\)_([0-9]+).*$/, "\\1_\\2", 1, $1) 
    m[ k ] = $2 # store value $2 from file1 
    next # line (of file1) 
    } 

    # file2 
    { 
    print $0 "|" m[$4] 
    } 

использовать его как это:

awk -f script.awk file1 file2 

Первый блок после FNR==NR выполняется для первый файл, next заботится о том, чтобы второй блок не был достигнут для первого файла. Этот блок вычисляет ключ (в формате второго файла) и сохраняет значение под ключом.

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

1

awk на помощь!

удалить скобки и посмотреть на матч

$ awk 'NR==FNR{sub(/\(/,"");sub(/\)/,""); a[$1]=$2; next} 
    {for(k in a) {if(k~$4) {print $0, a[k]; next}}}' file1 file2 

chr4 100009839 100009851 ADH5_1 70 
chr4 100006265 100006367 ADH5_2 50.83 
chr4 100003125 100003267 ADH5_3 46.67 

для труб разделителя, установите -v OFS='|'

Смежные вопросы