Код 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 95.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

желаемый результат:

com.acc.invm:FNS_PROD 95.0.5
com.acc.invm:SendSms 133.28.65

необходим вывод: Все компоненты из файла1 с более высокой версией, чем в файле2, только в первой десятичной позиции.

в желаемом выводе идет "com.acc.invm:FNS_PROD", потому что 96(в файле1) > 95(в файле2)

"com.acc.invm: FNS_TEST_DCCC_Mangment" не приходит, потому что 94.1.6(в файле1) 94.0.6 (в файле2), первое десятичное значение такое же (94=94).

попробовал код awk но не повезло.

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

Любое предложение будет приветствоваться.

2 ответа

Решение

Согласно вашему заявлению (только в первой десятичной позиции), вам не нужно curr = a[1]*10000 + a[2]*100 + a[3], Просто используйте curr = a[1] было бы хорошо.

Поскольку желаемый результат содержит только строку как в файле1, так и в файле2, поэтому ($1 in prev) && (curr > prev[$1]) нужно.

{split($2,a,/\./); curr = a[1];}
NR==FNR {prev[$1] = curr; next }
($1 in prev) && (curr > prev[$1])

DEMO

lo@ubuntu:~$ cat f1
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

lo@ubuntu:~$ cat f2
com.acc.invm:FNS_PROD 95.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

lo@ubuntu:~$ awk -f t.awk f1 f2
com.acc.invm:FNS_PROD 95.0.5
com.acc.invm:SendSms 133.28.65

lo@ubuntu:~$ cat t.awk 
{split($2,a,/\./); curr = a[1];}
NR==FNR {prev[$1] = curr; next }
($1 in prev) && (curr > prev[$1])
awk '{ Version = $2 
       sub( /[.].*/, "", Version)
       if ( FNR == NR ) Versionning[ $1] = Version
        else if( Versionning[ $1] < Version) print
     }' file1 file2

Вы можете адаптировать последнее, если отбросить несуществующую строку / продукт в файле 1, изменив условие с помощью Versionning [ $1] != "" && Versionning[ $1] < Version

Другие вопросы по тегам