/ / उपयोग कुंजी और युग्मन तत्वों पर्ल - पर्ल

चाबियाँ और युग्मन तत्व पर्ल - perl का प्रयोग करें

मेरा डेटा इस तरह दिखता है:

    G1  G2  G3  G4
Pf1 NO  B1  NO  D1
Pf2 NO  NO  C1  D1
Pf3 A1  B1  NO  D1
Pf4 A1  NO  C1  D2
Pf5 A3  B2  C2  D3
Pf6 NO  B3  NO  D3

मेरा उद्देश्य प्रत्येक कॉलम में जाँच करना है यदितत्व ("NO" मामलों से अलग) दो बार दिखाया गया है (जैसे स्तंभ 2 में A1, उदाहरण के लिए) और केवल दो बार (यदि यह तीन बार या अधिक दिखाया गया है तो मैं इसे आउटपुट में नहीं चाहता) और, यदि हां, तो पहले कॉलम के संवाददाता तत्व लिखें। तो, वांछित आउटपुट इस तरह दिखता है:

Pf3 Pf4 A1
Pf1 Pf3 B1
Pf2 Pf4 C1
Pf5 Pf6 D3

मैं एक पर्ल स्क्रिप्ट लिखने की कोशिश कर रहा हूं, लेकिन मुझे अलग-अलग चरणों पर ध्यान केंद्रित करने के लिए कुछ मदद चाहिए। यह वही है जो मैंने अभी तक किया है:

open (HAN, "< $file_in") || die "Impossible open the in_file";
@r = <HAN>;
close (HAN);
for ($i=0; $i<=$#r; $i++){
chomp ($r[$i]);
($Ids, @v) = split (/t/, $r[$i]);
}
}

लेकिन मैं किसी भी दिशा में नहीं जा सकता! (मेरे प्रति ज्ञान को आपके द्वारा धकेले जाने की आवश्यकता है!)

मेरे दिमाग में गर्म बिंदु हैं:

  • मैं एक ही कॉलम (या वैसे भी एक ही फ़ाइल में) से तत्वों की तुलना कैसे करूं?

  • मैं पहले कॉलम के तत्वों को दूसरे कॉलम वालों के साथ कैसे जोड़ सकता हूं (चाबियाँ हो सकती हैं)?

किसी भी मदद बिल्कुल आवश्यक है और स्वागत है!

उत्तर:

उत्तर № 1 के लिए 1
use Data::Dumper;

my %hash;
while (<DATA>) {

next if $.==1;
chomp;
my ($first,@others) = (split /s+/);
for (@others){
$hash{$_}.=" ".$first;
}
}

print Dumper %hash;
__DATA__
G1  G2  G3  G4
Pf1 NO  B1  NO  D1
Pf2 NO  NO  C1  D1
Pf3 A1  B1  NO  D1
Pf4 A1  NO  C1  D2
Pf5 A3  B2  C2  D3
Pf6 NO  B3  NO  D3

मैं यहाँ क्या उपयोग करता हूँ? (चाल)

while (<DATA>){BLOCK} - पर्ल स्क्रिप्ट फ़ाइल में विशिष्ट डेटा अनुभाग से डेटा पढ़ें। (हाँ, यदि आप चाहें, तो आप यहाँ परीक्षण डेटा रख सकते हैं। लेकिन "सब कुछ स्टोर न करें! यह एक बिन नहीं है!)

next if $.==1 - $. - विशेष चर, जो इनपुट डेटा की एक पंक्ति संख्या संग्रहीत करता है। जैसे "इंडेक्स"।

chomp; - वापस while(<DATA>)। पर्ल में कुछ चर छिपे हुए हैं। कार्यों में - @_ इनपुट मापदंडों की सरणी। और हमेशा पर्ल प्रोग्रामर का उपयोग करना पसंद करते हैं $_ - You चर।

और इस while(<DATA>) वास्तव में एक छिपा हुआ while(defined($_ = <DATA>)).

समारोह chomp उपयोग hidden-You चर और अंत में n प्रतीक को काटने का प्रयास करें।

समारोह split /REGEX/ डिफ़ॉल्ट चर के रूप में भी लें hidden-You परिवर्तनीय ($_)।


उत्तर № 2 के लिए 1

पर्ल मल्टी लाइनर :),

perl -anE "
/^S/ or next;
$k = shift @F;
push @{$t{$_}}, $k for@F;
}{
@$_-1==2 and say join" ",@$_ for map [@{$t{$_}},$_], sort keys%t;
" file