2011-06-16 12 views
41

मैं दो सरणियों की सामग्री की तुलना करने के & मूल्य जो powershellदो सरणियों की तुलना करना और मूल्यों जो आम

उदाहरण का उपयोग उनके बीच आम नहीं है पाने के लिए एक छोटा सा तर्क चाहता था नहीं कर रहे हैं मिलता है

[email protected](1,2,3,4,5) 
[email protected](1,2,3,4,5,6) 

$ सी जो आउटपुट है मुझे मुझे "6" मान देना चाहिए जो कि दोनों सरणी के बीच असामान्य मूल्य का आउटपुट है।

क्या कोई मेरी मदद कर सकता है! धन्यवाद!

+0

में याद कर रहे हैं में याद कर रहे हैं है कि पर्ल? पर्ल कुकबुक से यह पृष्ठ इस पर कुछ अच्छा इनपुट है: http://docstore.mik.ua/orelly/perl/cookbook/ch04_09.htm –

+0

हाय डैनियल मैं इसे शक्तियों में करना चाहता हूं – PowerShell

उत्तर

80
PS > $c = Compare-Object -ReferenceObject (1..5) -DifferenceObject (1..6) -PassThru 
PS > $c 
6 
+0

दो हैशटेबल्स की कुंजी संग्रह की तुलना करने की कोशिश करने वालों के लिए एक नोट: मुझे लगता है कि कुंजी संग्रह सरणी की तरह थे और मैं उनकी तुलना करने के लिए तुलना-वस्तु का उपयोग कर सकता था। यह पता चला है कि तुलना-ऑब्जेक्ट प्रत्येक कुंजी संग्रह को एक ऑब्जेक्ट के रूप में देखता है, इसलिए एक परिणाम देता है जो हैशटेबल में _ ** सभी ** _ कुंजी हैशटेबल दो से गायब है और इसके विपरीत। इसे काम करने के लिए मुझे कुंजी संग्रह को सरणी में परिवर्तित करना पड़ा। मुझे सबसे तेज़ तरीका मिला है: '$ कुंजी = @ ($ Null) * $ ht.Keys.Count' सही आकार की सरणी को आरंभ करने के लिए' $ ht.Keys.CopyTo ($ keys, 0) 'to सरणी को सरणी में कॉपी करें। –

15

Compare-Object

Compare-Object $a1 $b1 | ForEach-Object { $_.InputObject } 

पर देखो या अगर आप जानना चाहते हैं जहां किसी चीज़ अंतर्गत आता है, तो SideIndicator को देखने के लिए:

[email protected](1,2,3,4,5,8) 
[email protected](1,2,3,4,5,6) 
Compare-Object $a1 $b1 
+6

-PassThru विकल्प जोड़ना यह आउटपुट nicer बनाता है। तुलना करें-ऑब्जेक्ट $ a1 $ b1 -PassThru – MonkeyWrench

+0

जो मैं देख सकता हूं, 'तुलना-ऑब्जेक्ट $ a1 $ b1 | प्रत्येक ऑब्जेक्ट {$ _। इनपुट ऑब्जेक्ट} 'और' तुलना-ऑब्जेक्ट $ ए 1 $ बी 1 -पासथ्रू 'समान आउटपुट उत्पन्न करने लगते हैं। बेशक, -PassThru विकल्प अधिक संक्षिप्त है। –

0

यह मदद करनी चाहिए, सरल हैश तालिका का उपयोग करता।

$a[email protected](1,2,3,4,5) [email protected](1,2,3,4,5,6) 


$hash= @{} 

#storing elements of $a1 in hash 
foreach ($i in $a1) 
{$hash.Add($i, "present")} 

#define blank array $c 
$c = @() 

#adding uncommon ones in second array to $c and removing common ones from hash 
foreach($j in $b1) 
{ 
if(!$hash.ContainsKey($j)){$c = $c+$j} 
else {hash.Remove($j)} 
} 

#now hash is left with uncommon ones in first array, so add them to $c 
foreach($k in $hash.keys) 
{ 
$c = $c + $k 
} 
+0

संदिग्ध कोडिंग शैली को छोड़कर, हैशटेबल्स का उपयोग एक विकल्प के रूप में ऑपरेटर के रूप में है, ठीक नहीं है। सबसे बुरी चीज, यह समाधान तुलना-वस्तु में कुछ भी नहीं जोड़ता है। – dmitry

2

प्रयास करें:

[email protected](1,2,3,4,5) 
[email protected](1,2,3,4,5,6) 
(Compare-Object $a1 $b1).InputObject 

या, आप उपयोग कर सकते हैं:

(Compare-Object $b1 $a1).InputObject 

आदेश फर्क नहीं पड़ता।

+0

यह उत्तर क्यों बुरा है? हैश टेबल का उपयोग करने से यह आसान है। –

4

आपके परिणाम तब तक उपयोगी नहीं होंगे जब तक कि सरणी पहले क्रमबद्ध न हों। किसी सरणी को सॉर्ट करने के लिए, इसे सॉर्ट-ऑब्जेक्ट के माध्यम से चलाएं।

$x = @(5,1,4,2,3) 
$y = @(2,4,6,1,3,5) 

Compare-Object -ReferenceObject ($x | Sort-Object) -DifferenceObject ($y | Sort-Object) 
+1

-SyncWindow "मैच के लिए सरणी में कितना दूर दिखने में मदद करता है" – Garrett

+1

नहीं, सॉर्टिंग _not_ आवश्यक है: 'तुलना-ऑब्जेक्ट $ x $ y' उपरोक्त के समान परिणाम लौटाएगा, यह दर्शाता है कि संदर्भ में 6 गुम है सरणी। (मैंने इसे आज के पीएस संस्करण (5.1) के साथ-साथ पीएस संस्करण 3 के रूप में भी देखा है।) –

9

$a | Where {$b -NotContains $_} # रिटर्न जो $b में आइटम $a

$b | Where {$a -NotContains $_} # रिटर्न जो $a में आइटम $b

संबंधित मुद्दे