/ / पर्ल - एक निश्चित संख्या में वर्ण आईएनए फ़ाइल के बाद नई लाइन और टैब वर्ण जोड़ना? - पर्ल, डेटा-हेरफेर

पर्ल - एक निश्चित संख्या में वर्ण इना फ़ाइल के बाद नई लाइन और टैब वर्ण जोड़ना? - perl, डेटा-मैनिपुलेशन

मेरे पास एक पर्ल प्रश्न है। मेरे पास एक फ़ाइल है इस फ़ाइल की प्रत्येक पंक्ति में As Ts Gs और Cs की एक अलग संख्या है फ़ाइल नीचे की तरह दिखता है

ATCGCTGASTGATGCTG
GCCTAGCCCTTAGC
GTTCCATGCCCATAGCCAAATAAA

मैं प्रत्येक पंक्ति के लिए पंक्ति संख्या जोड़ना चाहूंगा फिर प्रत्येक 6 अक्षरों में एक n डालें और फिर बनाई गई नई पंक्तियों में से प्रत्येक पर एक डालें प्रत्येक 3 वर्णों को खाली स्थान

आउटपुट का उदाहरण होना चाहिए

Line NO 1
ATC GCT
GAS TGA
TGC TG

Line NO 2
GCC TAG
CCC TTA
GC

मैं नीचे दिए गए कोड के साथ आया हूं:

my $count = 0;
my $line;
my $row;
my $split;
open(F, "Data.txt") or die "Can"t read file: $!";
open (FH, " > UpDatedData.txt") or die "Can"t write new file: $!";
while (my $line = <F>) {
$count ++ ;
$row = join ("n",  ( $line =~ /.{1,6}/gs));
$split = join ("t",  ( $row =~ /.{3}/gs ));
print FH "Line NOt$countn$splitn";
}
close F;
close FH;

तथापि

यह निम्नलिखित पुट देता है

Line NO 1
ATC GCT
GA  STG A
T   GCT G

Line NO 2
GCC TAG
CC  CTT A
G   C

यह कोड की इस पंक्ति में वर्ण के रूप में गिने जा रहे n के साथ कुछ होना चाहिए

$split = join ("t",  ( $row =~ /.{3}/gs ));

किसी को भी इस समस्या के आसपास पाने के लिए कोई भी विचार मिला?

किसी भी तरह की सहायता का स्वागत किया जाएगा।

अग्रिम में धन्यवाद

Sinead

उत्तर:

जवाब के लिए 0 № 1

यह एक लाइनर है:

perl -plwe "s/(.{3})(.{0,3})/$1 $2n/g" data.txt

रेगेक्स 3 वर्णों के लिए दिखता है (नई रेखा से मेल नहीं खाता), इसके बाद 0-3 वर्ण और उन दोनों को पकड़ता है, फिर उनके बीच एक स्थान और नई रेखा सम्मिलित करता है।

लाइन नंबरों का ट्रैक रखने के लिए, आप जोड़ सकते हैं

s/^/Line NO $.n/;

जो इनपुट लाइन नंबर के आधार पर गणना करेगा। यदि आप चाहें, तो आप एक साधारण काउंटर रख सकते हैं, जैसे कि ++$i.

  • -l विकल्प आप के लिए newlines संभाल लेंगे।

आप इसे दो चरणों में भी कर सकते हैं, जैसे:

perl -plwe"s/.{6}K/n/g; s/^.{3}K/ /gm;"

का उपयोग करते हुए K (रखें) स्ट्रिंग के मिलान भाग को रखने के लिए यहां से बच निकलने का क्रम, और फिर 6 वर्णों के बाद केवल एक नई पंक्ति सम्मिलित करना, और फिर "लाइन की शुरुआत" के बाद एक स्थान 3 वर्ण, जो कि /m modifier में newlines भी शामिल है।

तो, संक्षेप में:

perl -plwe "s/.{6}K/n/g; s/^.{3}K/ /gm; s/^/Line NO $.n/;" data.txt
perl -plwe "s/(.{3})(.{0,3})/$1 $2n/g;    s/^/Line NO $.n/;" data.txt

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

इससे आपकी समस्या का समाधान हो जाना चाहिए:

use strict;
use warnings;

while (<DATA>) {
s/(.{3})(.{0,3})?/$1 $2 /g;
s/(.{7}) /$1n/g;

printf "Line NO %dn%sn", $., $_;
}

__DATA__
ATCGCTGASTGATGCTG
GCCTAGCCCTTAGC
GTTCCATGCCCATAGCCAAATAAA

जवाब के लिए 0 № 3

एक और समाधान। ध्यान दें कि यह उपयोग करता है लेक्सिकल फ़ाइलहैंडल तथा के तीन तर्क रूप open.

#!/usr/bin/perl
use warnings;
use strict;

open my $IN,  "<", "Data.txt"        or die "Can"t read file: $!";
open my $OUT, ">", "UpDatedData.txt" or die "Can"t write new file: $!";
my $count = 0;
while (my $line = <$IN>) {
chomp $line;
$line =~ s/(...)(...)/$1 $2n/g;         # Create pairs of triples
$line =~ s/(SSS)(S{1,2})$/$1 $2n/;  # A triple plus something at the end.
$line .= "n" if $line !~ /n$/;         # A triple or less at the end.
$count++;
print $OUT "Line NOt$countn$linen";
}
close $OUT;