![]() |
|
|
google unix.com
|
|||||||
| Forums | Register | Forum Rules | Links | Albums | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here. |
More UNIX and Linux Forum Topics You Might Find Helpful
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| how to convert Fixed length file to delimited file. | satyam_sat | Shell Programming and Scripting | 7 | 04-03-2008 03:41 AM |
| Converting a Delimited File to Fixed width file | raghavan.aero | Shell Programming and Scripting | 2 | 06-06-2007 03:44 PM |
| convert XML file into Text file(fixed length) | ram2s2001 | Shell Programming and Scripting | 0 | 11-03-2005 01:28 AM |
| Convert delimited to fixed length | nelson553011 | Shell Programming and Scripting | 14 | 10-27-2005 05:04 PM |
| how can change udp lenght? | Vvlad | IP Networking | 4 | 08-14-2003 08:37 AM |
![]() |
|
|
LinkBack | Thread Tools | Search this Thread | Rate Thread | Display Modes |
|
|
|
||||
|
Can we convert a '|' file into a fixed lenght???
Hi All,
I have a pipe separated flat file.But there is often some problem with the records.So is it possible to convert the '|' separated file into a fixed length file by means of some script. The file has 11 columns which means 10 pipes.Your help is appreciated. i'm using Sun OS Version 5.10 Thank you, Kumar |
|
||||
|
As the "fields" in your file are separated by a constant char ("|") use cut to separate them, then print the lines via printf (i assume Kornshell here, use 'echo' instead of 'print' if you are using something else): Code:
cat infile | while read line ; do
# split each input line to fields and catch these in variables
field1="$(print - "$line" | cut -d'|' -f1)"
field2="$(print - "$line" | cut -d'|' -f2)"
field3="$(print - "$line" | cut -d'|' -f3)"
.....
# after you are done with the line print it out again
# i assume here that the first column should be 20 chars wide, the next
# two 15, and so on. see the second example below.
printf '%20s %15s %15s [...]\n' "$field1" "field2" "$field3" [...] >> outfile
done
This is using (a fixed number of) fixed-width columns and you have to know the widths in advance. It is possible to create dynamically formatted columns but you will have to read the infile two times: Code:
maxlength1=0
maxlength2=0
....
cat infile | while read line ; do
# in the first run we split and get the max width for each column
field1="$(print - "$line" | cut -d'|' -f1)"
length1=$(print - "$field1" | wc -c)
if [ $length1 -gt $maxlength1 ] ; then
maxlength1=$length1
fi
field2="$(print - "$line" | cut -d'|' -f2)"
length2=$(print - "$field2" | wc -c)
if [ $length2 -gt $maxlength2 ] ; then
maxlength2=$length1
fi
.....
done
# put together the output template for printf
template='%'"$maxlength1"'s %"'$maxlength2"'s [.....]\n'
cat infile | while read line ; do
# in the second run we split again and print using the found widths
field1="$(print - "$line" | cut -d'|' -f1)"
field2="$(print - "$line" | cut -d'|' -f2)"
....
printf "$template" "$field1" "field2" "$field3" [...] >> outfile
done
I'd suggest you use (dynamical) arrays instead the numbered variables to make the script able to deal with a variable number of fields in the input file as a further enhancement. The column separator could then be provided as a parameter making the script as widely usable as possible. bakunin |
![]() |
| Bookmarks |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|