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

1 Like

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}\"