0

我有两个文件,它们的组件名称和版本号用空格分隔:

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 的所有组件。

如果 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

请注意,生成 BDMap 条目是因为 awk 不知道如何解析您的版本号,因此它们以文本形式进行比较。如果您可以使用具有固定位数(如 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 回答