2016-05-10 45 views
0

我有兩個變量,如下所示。Unix中基於數值的比較

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 

如果條件失敗,因爲它是在b可變位置1處的尋找rw值從a可變但它是在可變b位置2。

即使字段的順序不一樣,我如何比較這兩行?

+0

你的意思是第二項任務是開始'b = bg,rw,hard,...'? –

+0

所以,你想檢查兩個變量中逗號分隔字段的列表是否相等,即使這些字段不是全部是相同的順序?你有哪個shell('bash',或其他)? awk是一個選項嗎? –

+0

@Jonathan Leffler。這是對的,我使用bash.I awk。 – Vijay

回答

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" 
      }' 

示例運行:

$ bash pairing.sh 
Unmatched item (row 2): rg 
Unmatched item (row 1): rw 
2 Mismatches 
$ sed -i.bak 's/,rg,/,rw,/' pairing.sh 
$ bash pairing.sh 
Rows are the same 
$ 

無疑有辦法讓劇本更加緊湊​​,但代碼是相當直接的。如果一個字段在第二行出現兩次並在第一行出現一次,則第二行將被報告爲不匹配的項目。代碼在處理第一行時不檢查重複內容 - 這很容易做到。該代碼不會打印輸入數據以進行驗證;它可能應該。