Unix文件比较

时间:2015-10-05 07:33:46

标签: unix awk file-comparison

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

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

希望我明白我的要求。

2 个答案:

答案 0 :(得分: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,这将解决它,但我想您不想这样做,所以我们需要更多地处理上面的内容。

答案 1 :(得分: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