Unix 文件比较
Unix file comparison
我有两个文件,组件名称和版本号由 space 分隔:
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
希望我清楚我的要求。
这是一个简单的解决方案 "almost there":
join -a1 file1 file2 | awk ' > {print ,}'
它产生:
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,这将解决它,但我想您不想这样做,所以我们需要在上面做更多的工作。
$ cat tst.awk
{ split(,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3] }
NR==FNR { prev[] = curr; next }
!( in prev) || (curr > prev[])
$ 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
我有两个文件,组件名称和版本号由 space 分隔:
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
希望我清楚我的要求。
这是一个简单的解决方案 "almost there":
join -a1 file1 file2 | awk ' > {print ,}'
它产生:
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,这将解决它,但我想您不想这样做,所以我们需要在上面做更多的工作。
$ cat tst.awk
{ split(,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3] }
NR==FNR { prev[] = curr; next }
!( in prev) || (curr > prev[])
$ 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