Problems with cut

Hi all,

0680046755000011 3040249 3005930 60180GPRS4Samsung_SGH_Z500

This is the format of my log file and parameters for log file are like

� 10 first characters: MSISDN
� 6 next characters: Hour
� 18 next characters: ID SA Source
� 18 next characters: ID SA Destination

I have 11 whitespaces in between my first and second colums.I need to cut fitst 10 char next 6 char and next 18 char(including white spaces) . and i tried follwing in my code

MSISDN=`echo $data | cut -c1-10`
HOUR=`echo $data | cut -c11-16`
ID_SA_SOURCE=`echo $data | cut -c17-35`
ID_SA_DEST=`echo $data | cut -c36-54`

But becos of whitespaces it is not cutting properly.. can any one suggest alternatives

Thnks

First reduce the spaces in between the log file data with the command tr

HOUR=`echo $data | tr -s " " |cut -c11-16`

give a try to this one.

Hi
Thanks for the reply

But i cant trim my whitespaces from log files . i need to take that also..
becos parameters are set like
� 10 first characters: MSISDN
� 6 next characters: Hour
� 18 next characters: ID SA Source
� 18 next characters: ID SA Destination
This characters includes white spaces also

id=`echo 0680046755000011 3040249 3005930 60180GPRS4Samsung_SGH_Z500 | tr -s " " |cut -c17-35`
output is --- 3040249 3005930 60

Hi ,

Actually the log file is like 0608166896000001 in my first column 11 whitespaces and 3001339 in my second column( 3001339) then 11 whitespaces and
3204235 in my third coumn . ...

But while reading line by line using following code

while read data
do
echo data $data
ID_SA_SOURCE=`echo $data | cut -c17-35`
echo ID_SA_SOURCE $ID_SA_SOURCE
done < $TRACKING_LOGDIR/$listdata

I am not getting the 11 white spaces in "data" variable instead of i am getting only one space..i want 11whtespaces first and 3001339 value in my ID_SA_SOURCE variable....

CAn you pleasse check this

You need to properly quote your variables when you echo them, otherwise the shell will trim whitespace. I'd advise against using echo at all, though.

But here's how to quote properly. To be a little bit on the safe side, I also zap IFS; I don't believe it's strictly necessary here, but it's a technique you should be aware of.

OLDIFS=$IFS
IFS='
' # just a newline, in single quotes
while read data
do
  MSISDN="`echo "$data" | cut -c1-10`"
  HOUR="`echo "$data" | cut -c11-16`"
  ID_SA_SOURCE="`echo "$data" | cut -c17-35`"
  ID_SA_DEST="`echo "$data" | cut -c36-54`"
done < $TRACKING_LOGDIR/$listdata
IFS=$OLDIFS

Having that out of the way, how about something like this?

awk '{ OFS=":"; print substr($0, 1, 10), substr($0, 11, 16),
    substr($0, 17, 35), substr($0, 17, 35) }' $TRACKING_LOGDIR/$listdata |
while IFS=: read MSISDN HOUR ID_SA_SOURCE ID_SA_DEST; do
  echo "'$HOUR': All your '$ID_SA_SOURCE' are '$ID_SA_DEST' to '$MSISDN'"
done

Hi All,

I tried the first its working Thanks to all :slight_smile: