Rajeev Prasad wrote:
Thank you John,
that is almost perfect. only two issues:
1. getting error on sort for each line of input, column 5 onwards is text...:
Argument "154 Overload Status\n" isn't numeric in sort at ./test.pl line
30,<IN_FH> line 208.
2. by chaniging the column number in join (...[0,-1]) to (...[2,-1]) I am
not getting column 2 and 5 in output, it still send column 1 and 5 in output
file.
again, that was cool.
-Rajeev
from Linux:
cut -f1,5- -d" " file |grep -v "^0" | sort -n> to_file
to perl:
open IN_FH, '<', 'file' or die "Cannot open 'file' because: $!";
open OUT_FH, '>', 'to_file' or die "Cannot open 'to_file' because: $!";
print OUT_FH sort { $a<=> $b } map /^0/ ? () : join( ' ', ( split / +/, $_, 5 )[ 0,
-1 ] ),<IN_FH>;
I tried to put my understanding in words:
1. 0. operations starts from right most part of statement (statement
ends with ;)
2. split = breaks the line (contained in $_)
/ +/ = any number of white space
$_ = the current line in in-built perl string variable
5 = number of fields string will be split into
3. join = joins the new resulting string from eariler split
' ' = uses single space as seperator
[0,-1] = element 0 and -1 of array repersented by (split...)
4. map =<=========================================not able to
understand map (map expr, list )
/^0/ = expression to check wether line starts with 0
? = if line starts with zero then ??? not sure....
() = not sure...
: = not sure...
5. sort = sorts the final array on first column (which is by the way
numerical)
6. OUT_FH = writes the outcome to the file_handle.
The flow goes from <IN_FH> to map to sort to print.
<IN_FH> reads the file lines and passes the list of lines to map.
map has each line in $_. This is matched with /^0/ and if it does match
then return the empty list and if it doesn't match remove columns 2, 3
and 4 and then pass the resulting list to sort
sort does a numerical sort and then passes the sorted list to print.
print prints out the list to the filehandle OUT_FH.
To remove the error message you could do this:
{ no warnings;
print OUT_FH sort { $a <=> $b } map /^0/ ? () : join( ' ', ( split
/ +/, $_, 5 )[ 0, -1 ] ), <IN_FH>;
}
John
--
Any intelligent fool can make things bigger and
more complex... It takes a touch of genius -
and a lot of courage to move in the opposite
direction. -- Albert Einstein
--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/