मेरा डेटा इस तरह दिखता है:
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 के लिए 1use 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