Try:
#!/usr/bin/perl
open I, "$ARGV[0]";
@x=<I>;
chomp($d=`date +%Y%m%d`);
$i=0;
for (@x){
s/ +$//;
$t=$_;
@s=split / +/;
if ($#s==10){
$i=1;
s/([^ ]+ +EUR)1([SB]\d+ +)[^ ]+( +)1/$1$2 ${3}0/;
/([^ ]+ +){5}(\d+)/;
$h=int($2/3600000000);
$m=int(60*($2/3600000000-$h));
$sek=int(60*(60*($2/3600000000-$h)-$m));
$time=sprintf "%02d:%02d:%02d",$h,$m,$sek;
$date=$d . "-" . $time;
s/(([^ ]+ +){5})\d+/$1$date/;
$t=~s/(([^ ]+ +){6})\d+/$1$date/;
$s.=$_;
$q.=$t;
} elsif ($i) {
$i=0;
$s.=$q;
$s.=$t;
} else {
$s.=$t;
}
}
$s.=$q if $i;
print $s;
1 Like
Hi bartu11,
Sorry, but I have given another update on the task.
I was told this should be last change. Thanks thousand times.
this is the new INPUT: as oyu can see there was added one more column(last in red) , so we search for rows with 12 columns + time format in green in case of rows needed to be duplicited is slightly different
H: EURS100 00440000000050.00000000000000010100000075 FR0000045072 2ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #A
H: EURB100 00440000000050.00000000000000010100000096 FR0000045072 1ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #R
H: EUR1B101 B101 10440000000420.00000000000000099100000098 FR0000120628 1CSp 2011-06-08 10:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #A 34633539544
H: EUR1S101 S101 10440000000420.00000000000000099100000099 FR0000120628 2CSp 2011-06-08 10:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #R 34633539544
this is desired OUTPUT, as you can see time format in green is slightly different then rest, so it will have to be converted + time of the duplicated rows should be calculated from the last column in red(milicesonds since midnight).
H: EURS100 00440000000050.00000000000000010100000075 FR0000045072 2ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #A
H: EURB100 00440000000050.00000000000000010100000096 FR0000045072 1ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #R
H: EURB101 00440000000420.00000000000000099100000098 FR0000120628 1CSp 20110608-09:36:13TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #A 34633539544
H: EURS101 00440000000420.00000000000000099100000099 FR0000120628 2CSp 20110608-09:36:13TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #R 34633539544
H: EUR1B101 B101 10440000000420.00000000000000099100000098 FR0000120628 1CSp 20110608-10:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #A 34633539544
H: EUR1S101 S101 10440000000420.00000000000000099100000099 FR0000120628 2CSp 20110608-10:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #R 34633539544
No need to apologize Try:
#!/usr/bin/perl
open I, "$ARGV[0]";
@x=<I>;
$i=0;
for (@x){
s/ +$//;
$t=$_;
@s=split / +/;
if ($#s==11){
$i=1;
s/([^ ]+ +EUR)1([SB]\d+ +)[^ ]+( +)1/$1$2 ${3}0/;
/([^ ]+ +){5}(\d+)-(\d+)-(\d+) (\d+:\d+:\d+)/;
$d="$2$3$4";
$date2="$d-$5";
/(\d+)$/;
$h=int($1/3600000000);
$m=int(60*($1/3600000000-$h));
$sek=int(60*(60*($1/3600000000-$h)-$m));
$time=sprintf "%02d:%02d:%02d",$h,$m,$sek;
$date1=$d . "-" . $time;
s/(([^ ]+ +){5})\d+-\d+-\d+ \d+:\d+:\d+/$1$date1/;
$t=~s/(([^ ]+ +){6})\d+-\d+-\d+ \d+:\d+:\d+/$1$date2/;
$s.=$_;
$q.=$t;
} elsif ($i) {
$i=0;
$s.=$q;
$s.=$t;
} else {
$s.=$t;
}
}
$s.=$q if $i;
print $s;
1 Like
Hi , output was different
then I found out that I mislead you because now we have 13 columns
as you can see highighted there is one additional space between date and time in the INPUT:
H: EURS100 00440000000050.00000000000000010100000075 FR0000045072 2ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #A
H: EURB100 00440000000050.00000000000000010100000096 FR0000045072 1ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #R
H: EUR1B101 B101 10440000000420.00000000000000099100000098 FR0000120628 1CSp 2011-06-08 10:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #A 34633539544
H: EUR1S101 S101 10440000000420.00000000000000099100000099 FR0000120628 2CSp 2011-06-08 10:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #R 34633539544
Try this then:
#!/usr/bin/perl
open I, "$ARGV[0]";
@x=<I>;
$i=0;
for (@x){
s/ +$//;
$t=$_;
@s=split / +/;
if ($#s==12){
$i=1;
s/([^ ]+ +EUR)1([SB]\d+ +)[^ ]+( +)1/$1$2 ${3}0/;
/([^ ]+ +){5}(\d+)-(\d+)-(\d+) (\d+:\d+:\d+)/;
$d="$2$3$4";
$date2="$d-$5";
/(\d+)$/;
$h=int($1/3600000000);
$m=int(60*($1/3600000000-$h));
$sek=int(60*(60*($1/3600000000-$h)-$m));
$time=sprintf "%02d:%02d:%02d",$h,$m,$sek;
$date1=$d . "-" . $time;
s/(([^ ]+ +){5})\d+-\d+-\d+ \d+:\d+:\d+/$1$date1/;
$t=~s/(([^ ]+ +){6})\d+-\d+-\d+ \d+:\d+:\d+/$1$date2/;
$s.=$_;
$q.=$t;
} elsif ($i) {
$i=0;
$s.=$q;
$s.=$t;
} else {
$s.=$t;
}
}
$s.=$q if $i;
print $s;
1 Like
Thanks, works perfectly.
I wast just given the last change. This is definitely the last change that they request.They have sweared that this is the LAST change.
We need to delete 1 hour from the time highighted in red.
it was "10:41:26" but we need "09:41:26"
Million thanks
H: EURS100 00440000000050.00000000000000010100000075 FR0000045072 2ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #A
H: EURB100 00440000000050.00000000000000010100000096 FR0000045072 1ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #R
H: EUR1B101 B101 10440000000420.00000000000000099100000098 FR0000120628 1CSp 2011-06-08 10:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #A 34633539544
H: EUR1S101 S101 10440000000420.00000000000000099100000099 FR0000120628 2CSp 2011-06-08 10:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #R 34633539544
this is desired OUTPUT, as you can see time format in green is slightly different then rest, so it will have to be converted + time of the duplicated rows should be calculated from the last column in red(milicesonds since midnight).
H: EURS100 00440000000050.00000000000000010100000075 FR0000045072 2ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #A
H: EURB100 00440000000050.00000000000000010100000096 FR0000045072 1ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #R
H: EURB101 00440000000420.00000000000000099100000098 FR0000120628 1CSp 20110608-09:36:13TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #A 34633539544
H: EURS101 00440000000420.00000000000000099100000099 FR0000120628 2CSp 20110608-09:36:13TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #R 34633539544
H: EUR1B101 B101 10440000000420.00000000000000099100000098 FR0000120628 1CSp 20110608-09:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #A 34633539544
H: EUR1S101 S101 10440000000420.00000000000000099100000099 FR0000120628 2CSp 20110608-09:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #R 34633539544
Try this one:
#!/usr/bin/perl
open I, "$ARGV[0]";
@x=<I>;
$i=0;
for (@x){
s/ +$//;
$t=$_;
@s=split / +/;
if ($#s==12){
$i=1;
s/([^ ]+ +EUR)1([SB]\d+ +)[^ ]+( +)1/$1$2 ${3}0/;
/([^ ]+ +){5}(\d+)-(\d+)-(\d+) (\d+)(:\d+:\d+)/;
$d="$2$3$4";
$h2=sprintf "%02d", ($5-1);
$date2="$d-$h2$6";
/(\d+)$/;
$h=int($1/3600000000);
$m=int(60*($1/3600000000-$h));
$sek=int(60*(60*($1/3600000000-$h)-$m));
$time=sprintf "%02d:%02d:%02d",$h,$m,$sek;
$date1=$d . "-" . $time;
s/(([^ ]+ +){5})\d+-\d+-\d+ \d+:\d+:\d+/$1$date1/;
$t=~s/(([^ ]+ +){6})\d+-\d+-\d+ \d+:\d+:\d+/$1$date2/;
$s.=$_;
$q.=$t;
} elsif ($i) {
$i=0;
$s.=$q;
$s.=$t;
} else {
$s.=$t;
}
}
$s.=$q if $i;
print $s;
2 Likes
thanks
I accidentaly removed one change from my previous post and realized just now. (Time decreasing worked fine.)
highlighted in blue font is the change that I removed accidentally.
Also two lines are swapped(S101 first, B101 second - but this is not so critical)
I'm really really SORRY, I don't do this on purpose. Please check
H: EURS100 00440000000050.00000000000000010100000075 FR0000045072 2ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #A
H: EURB100 00440000000050.00000000000000010100000096 FR0000045072 1ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #R
H: EUR1B101 B101 10440000000420.00000000000000099100000098 FR0000120628 1CSp 2011-06-08 10:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #A 34633539544
H: EUR1S101 S101 10440000000420.00000000000000099100000099 FR0000120628 2CSp 2011-06-08 10:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #R 34633539544
H: EURS100 00440000000050.00000000000000010100000075 FR0000045072 2ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #A
H: EURB100 00440000000050.00000000000000010100000096 FR0000045072 1ACAp 20110608-08:06:13BNABFRPP PA BNABFRPP PARBFRPP #R
H: EURB101 00440000000420.00000000000000099100000098 FR0000120628 1CSp 20110608-09:36:13TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #A 34633539544
H: EURS101 00440000000420.00000000000000099100000099 FR0000120628 2CSp 20110608-09:36:13TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #R 34633539544
H: EUR1S101 S101 10440000000000.00099000042000000100000099 FR0000120628 2CSp 20110608-09:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #R 34633539544
H: EUR1B101 B101 10440000000000.00099000042000000100000098 FR0000120628 1CSp 20110608-09:41:26TRADETESTBIC5 PA TRADETESTBIC5 TESTCLRXX #A 34633539544
I implemented line swapping as well, check if it is working properly:
#!/usr/bin/perl
open I, "$ARGV[0]";
@x=<I>;
$i=0;
for (@x){
s/ +$//;
$t=$_;
@s=split / +/;
if ($#s==12){
$i=1;
s/([^ ]+ +EUR)1([SB]\d+ +)[^ ]+( +)1/$1$2 ${3}0/;
/([^ ]+ +){5}(\d+)-(\d+)-(\d+) (\d+)(:\d+:\d+)/;
$d="$2$3$4";
$h2=sprintf "%02d", ($5-1);
$date2="$d-$h2$6";
/(\d+)$/;
$h=int($1/3600000000);
$m=int(60*($1/3600000000-$h));
$sek=int(60*(60*($1/3600000000-$h)-$m));
$time=sprintf "%02d:%02d:%02d",$h,$m,$sek;
$date1=$d . "-" . $time;
s/(([^ ]+ +){5})\d+-\d+-\d+ \d+:\d+:\d+/$1$date1/;
$t=~s/(([^ ]+ +){6})\d+-\d+-\d+ \d+:\d+:\d+/$1$date2/;
$t=~s/(([^ ]+ +){3}\d{11})(\d{3})\.\d{15}(\d{2})/${1}000.000${4}0000${3}00000/;
$s.=$_;
$q="$t$q";
} elsif ($i) {
$i=0;
$s.=$q;
$q="";
$s.=$t;
} else {
$s.=$t;
}
}
$s.=$q if $i;
print $s;
1 Like
GREAT, it's working perfectly.
You are the best.
Thank you again for all your effort