2015-10-09 3 views
1

два файла, который имеет имя компонента и номер версии, разделенных пробелом:AWK сценария не работает

cat file1 
com.acc.invm:FNS_PROD 94.0.5 
com.acc.invm:FNS_TEST_DCCC_Mangment 94.1.6 
com.acc.invm:FNS_APIPlat_BDMap 100.0.9 
com.acc.invm:SendEmail 29.6.113 
com.acc.invm:SendSms 12.23.65 

cat file2 
com.acc.invm:FNS_PROD 94.0.5 
com.acc.invm:FNS_TEST_DCCC_Mangment 94.0.6 
com.acc.invm:FNS_APIPlat_BDMap 100.0.10 
com.acc.invm:SendEmail 29.60.113 
com.acc.invm:SendSms 133.28.65 
com.acc.invm:distri_cob 110 

нужен результат: Все компоненты из file2 с более высокой версии, чем в file1.

Мы должны игнорировать компоненты из файла2, если это не в файле1, и компоненты с одинаковой версией и более низкой версией в файле1.

В этом примере желаемый выход

com.acc.invm:FNS_APIPlat_BDMap 100.0.10 
com.acc.invm:SendEmail 29.60.113 
com.acc.invm:SendSms 133.28.65 

попробовал этот AWK код, но получение данных из file2 также

cat rst.awk 
{ split($2,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3] } 
NR==FNR { prev[$1] = curr; next } 
(curr > prev[$1]) || !($1 in prev) 
/usr/bin/nawk -f rst.awk file1 file2 

ВЫХОД:

com.acc.invm:FNS_APIPlat_BDMap 100.0.10 
com.acc.invm:SendEmail 29.60.113 
com.acc.invm:SendSms 133.28.65 
com.acc.invm:distri_cob 110 

ответ

2

Эта линия

(curr > prev[$1]) || !($1 in prev) 

должен быть изменен на

($1 in prev) && (curr > prev[$1]) 

Так как вы хотите, чтобы игнорировать элементы во втором файле, которые не в первом файле, ваша логика в основном

if ($1 in prev) { 
    if (curr > prev[$1]) { 
     print 
    } 
} 

но if (x) if (y) эквивалентно if (x && y)

+0

спасибо Vaughan :) – rKSH

+0

в настоящее время я звоню /usr/bin/nawk -f rst.awk file1 file2 в моем скрипте, это можно написать содержимое rst.awk в самом скрипте? После этого мне не нужно проверять файл rst.awk каждый раз, когда присутствует файл rst.awk погоды или нет. Помощь с использованием – rKSH

+0

@ RakeshSinghTomar: см. Http://www.cyberciti.biz/faq/bash-scripting-using-awk/ –

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