0

コンポーネント名とバージョン番号がスペースで区切られた 2 つのファイルがあります。

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

必要な出力は次のとおりです。 file1 よりもバージョンが高い file2 のすべてのコンポーネント。

file2 のコンポーネントが file1 にない場合は無視する必要があり、file1 に同じバージョンとそれより低いバージョンのコンポーネントがある場合は無視する必要があります。

この例では、目的の出力は次のとおりです。

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

私の要件が明確であることを願っています。

4

2 に答える 2

1

これは、「ほぼそこにある」簡単な解決策です。

join -a1 file1 file2 | awk '$2 > $3 {print $1,$2}'

以下を生成します。

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

awk はバージョン番号を解析する方法がわからないため、BDMap エントリが生成されることに注意してください。したがって、それらはテキストで比較されます。100.000.009 のような固定桁数のバージョン番号を使用できる場合は、これで解決しますが、そうしたくないと思われるので、上記についてもう少し作業する必要があります。

于 2015-10-05T09:57:20.960 に答える
0
$ cat 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])

$ awk -f tst.awk file2 file1
com.acc.invm:FNS_TEST_DCCC_Mangment 94.1.6
com.acc.invm:SendEmail 29.6.113
com.acc.invm:SendSms 12.23.65
于 2015-10-05T13:01:23.780 に答える