Inserting commas into file at set locations...

Hey everyone.

What would be the best method to insert commas (or comma-quotes) into a file at set locations.

Every line in the file looks like this:

 1234567890123456 123456BIGAUDIODYNAMITE33      123.12  123456  12345678901234MARK E WILLIAMS           123456

The comma's should appear at: 11,17,18,20,22,24,40,45,54,62,78,101,103,105,107

Hence the line above should look like (with comma quotes)

" 1234567890","123456"," ","12","34","56","BIGAUDIODYNAMITE","33   ","   123.12", "  123456","  12345678901234","MARK E WILLIAMS           ","12","34","56

Someone surely has a script that does this...

Thanks in Advance

#!/bin/sh

while read line
do
F1=`echo $line | cut -c1-7`
F2=`echo $line | cut -c8-17`
F3=`echo $line | cut -c17-27`
echo "$F1,$F2,$F3"
done

The script seems to be ignoring multiple spaces in the input.

Adapting to your script I get:

#!/bin/sh
set -x
while read line
do
F1=`echo $line | cut -c1-10`
F2=`echo $line | cut -c11-16`
F3=`echo $line | cut -c17-17`
F4=`echo $line | cut -c18-19`
F5=`echo $line | cut -c20-21`
F6=`echo $line | cut -c22-23`
F7=`echo $line | cut -c24-39`
F8=`echo $line | cut -c40-44`
F9=`echo $line | cut -c45-53`
F10=`echo $line | cut -c54-61`
F11=`echo $line | cut -c62-77`
F12=`echo $line | cut -c78-100`
F13=`echo $line | cut -c101-102`
F14=`echo $line | cut -c103-104`
F15=`echo $line | cut -c105-107`
echo "$F1,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$F10,$F11,$F12,$F13,$F14,$F15"
done

root@astrocloud:# ./test.sh
+ read line
1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c1-10
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ F1=1234567890
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c11-16
+ F2=123456
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c17-17
+ F3=
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c18-19
+ F4=12
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c20-21
+ F5=34
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c22-23
+ F6=56
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c24-39
+ F7=BIGAUDIODYNAMITE
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c40-44
+ F8=33 12
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c45-53
+ F9=3.12 1234
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c54-61
+ F10=56 12345
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c62-77
+ F11=678901234MARK E
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c78-100
+ F12=WILLIAMS 123456
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c101-102
+ F13=
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c103-104
+ F14=
+ echo 1234567890123456 123456BIGAUDIODYNAMITE33 123.12 123456 12345678901234MARK E WILLIAMS 123456
+ cut -c105-107
+ F15=
+ echo 1234567890,123456, ,12,34,56,BIGAUDIODYNAMITE,33 12,3.12 1234,56 12345,678901234MARK E ,WILLIAMS 123456,,,
1234567890,123456, ,12,34,56,BIGAUDIODYNAMITE,33 12,3.12 1234,56 12345,678901234MARK E ,WILLIAMS 123456,,,

Starting at F8 (bolded above) it should have read in "33 "

Thanks again for any insight.

Hi,
Please find below perl oneliner that may be of use.
Please not I have not completed every field but this should be easy to complete.

myfile.in contains the following line :-

1234567890123456 123456BIGAUDIODYNAMITE33      123.12  123456  12345678901234MARK E WILLIAMS           123456

Explanation of code:
(.{10}) assigns the first 10 characters to $1 ie 1234567890
(.{6}) assigns the next 6 character to $2 ie 123456 and so on.
/"$1","$2","$3","$4",/g then prints out the fields and adds the quotes and commas were
required.

perl -p -i -e 's/^(.{10})(.{6})(.{1})(.{2})/"$1","$2","$3","$4",/g' < myfile.in

Output:

"1234567890","123456"," ","12",3456BIGAUDIODYNAMITE33      123.12  123456  12345678901234MARK E WILLIAMS           123456

Note I have only completed the first four fields and leave it to you to complete if you so wish to.

Cheers
SRG

Yes!!! Perl is awesome!

Glad to be of assistance Astrocloud and thanks for my first thanks :slight_smile:

line=" 1234567890123456 123456BIGAUDIODYNAMITE33      123.12  123456  12345678901234MARK E WILLIAMS           123456
"

echo \"${line:1:10}\",\"${line:11:6}\",\"${line:17:1}\",\"${line:18:2}\"