Bash Unix中基于值的比较
我有两个变量,如下所示Bash Unix中基于值的比较,bash,shell,unix,awk,Bash,Shell,Unix,Awk,我有两个变量,如下所示 a=rw,bg,hard,timeo=600,wsize=1048576,rsize=1048576,nfsvers=3,tcp,actimeo=0,noacl,lock b=bg,rg,hard,timeo=600,wsize=1048576,rsize=1048576,nfsvers=3,tcp,actimeo=0,noacl,lock 如果条件在查找rw值时失败,则a变量位于b变量中的位置1,但它位于变量b中的位置2 即使字段的顺序不同,如何比较这两行?此脚本似乎
a=rw,bg,hard,timeo=600,wsize=1048576,rsize=1048576,nfsvers=3,tcp,actimeo=0,noacl,lock
b=bg,rg,hard,timeo=600,wsize=1048576,rsize=1048576,nfsvers=3,tcp,actimeo=0,noacl,lock
如果条件在查找rw
值时失败,则a
变量位于b
变量中的位置1,但它位于变量b
中的位置2
即使字段的顺序不同,如何比较这两行?此脚本似乎可以工作:
a="rw,bg,hard,timeo=600,wsize=1048576,rsize=1048576,nfsvers=3,tcp,actimeo=0,noacl,lock"
b="bg,rg,hard,timeo=600,wsize=1048576,rsize=1048576,nfsvers=3,tcp,actimeo=0,noacl,lock"
{ echo "$a"; echo "$b"; } |
awk -F, \
'NR == 1 { for (i = 1; i <= NF; i++) a[$i] = 1 }
NR == 2 { for (i = 1; i <= NF; i++)
{
if ($i in a)
delete a[$i]
else
{
mismatch++
print "Unmatched item (row 2):", $i
}
}
}
END {
for (i in a)
{
print "Unmatched item (row 1):", i
mismatch++
}
if (mismatch > 0)
print mismatch, "Mismatches"
else
print "Rows are the same"
}'
毫无疑问,有一些方法可以使脚本更加紧凑,但代码相当简单。如果某个字段在第二行中出现两次,在第一行中出现一次,则第二个字段将报告为不匹配项。在处理第一行时,代码不会检查重复项——让它这样做很容易。代码不打印输入数据进行验证;可能应该是这样。这个脚本似乎可以工作:
a="rw,bg,hard,timeo=600,wsize=1048576,rsize=1048576,nfsvers=3,tcp,actimeo=0,noacl,lock"
b="bg,rg,hard,timeo=600,wsize=1048576,rsize=1048576,nfsvers=3,tcp,actimeo=0,noacl,lock"
{ echo "$a"; echo "$b"; } |
awk -F, \
'NR == 1 { for (i = 1; i <= NF; i++) a[$i] = 1 }
NR == 2 { for (i = 1; i <= NF; i++)
{
if ($i in a)
delete a[$i]
else
{
mismatch++
print "Unmatched item (row 2):", $i
}
}
}
END {
for (i in a)
{
print "Unmatched item (row 1):", i
mismatch++
}
if (mismatch > 0)
print mismatch, "Mismatches"
else
print "Rows are the same"
}'
毫无疑问,有一些方法可以使脚本更加紧凑,但代码相当简单。如果某个字段在第二行中出现两次,在第一行中出现一次,则第二个字段将报告为不匹配项。在处理第一行时,代码不会检查重复项——让它这样做很容易。代码不打印输入数据进行验证;可能应该是这样。您是说第二次赋值开始
b=bg,rw,hard,…
?因此,您想检查两个变量中逗号分隔的字段列表是否相等,即使字段的顺序不尽相同?您有哪个shell(bash
,或者其他什么)?awk
是一种选择吗?@jonathanleffler。是的,我使用bash。我有awk。你是说第二个赋值开始b=bg,rw,hard,…
?那么,你想检查两个变量中逗号分隔的字段列表是否相等,即使这些字段的顺序不同?您有哪个shell(bash
,或者其他什么)?awk
是一种选择吗?@jonathanleffler。没错,我用bash,我有awk。