文件比较中的awk代码
awk code in file comparision
两个文件,组件名称和版本号由 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 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
需要的输出是:file1 中版本高于 file2 的所有组件,仅在第一个小数位。
所需的输出 "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(,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3] }
NR==FNR { prev[] = curr; next }
!( in prev) || (curr > prev[])
/usr/bin/nawk -f file2 file1 tst.awk
欢迎提出任何建议。
根据您的说法(仅在第一个小数位),您不需要curr = a[1]*10000 + a[2]*100 + a[3]
。用curr = a[1]
就可以了。
由于您想要的输出只包含 file1 和 file2 中的行,因此需要 ( in prev) && (curr > prev[])
。
{split(,a,/\./); curr = a[1];}
NR==FNR {prev[] = curr; next }
( in prev) && (curr > prev[])
演示版
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(,a,/\./); curr = a[1];}
NR==FNR {prev[] = curr; next }
( in prev) && (curr > prev[])
awk '{ Version =
sub( /[.].*/, "", Version)
if ( FNR == NR ) Versionning[ ] = Version
else if( Versionning[ ] < Version) print
}' file1 file2
您可以调整最后一个 if 以丢弃文件 1 中不存在的 line/product 并使用 Versionning [ ] != "" && Versionning[ ] < Version
更改条件
两个文件,组件名称和版本号由 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 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
需要的输出是:file1 中版本高于 file2 的所有组件,仅在第一个小数位。
所需的输出 "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(,a,/\./); curr = a[1]*10000 + a[2]*100 + a[3] }
NR==FNR { prev[] = curr; next }
!( in prev) || (curr > prev[])
/usr/bin/nawk -f file2 file1 tst.awk
欢迎提出任何建议。
根据您的说法(仅在第一个小数位),您不需要curr = a[1]*10000 + a[2]*100 + a[3]
。用curr = a[1]
就可以了。
由于您想要的输出只包含 file1 和 file2 中的行,因此需要 ( in prev) && (curr > prev[])
。
{split(,a,/\./); curr = a[1];}
NR==FNR {prev[] = curr; next }
( in prev) && (curr > prev[])
演示版
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(,a,/\./); curr = a[1];}
NR==FNR {prev[] = curr; next }
( in prev) && (curr > prev[])
awk '{ Version =
sub( /[.].*/, "", Version)
if ( FNR == NR ) Versionning[ ] = Version
else if( Versionning[ ] < Version) print
}' file1 file2
您可以调整最后一个 if 以丢弃文件 1 中不存在的 line/product 并使用 Versionning [ ] != "" && Versionning[ ] < Version