Script help


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Script help
# 1  
Old 04-20-2005
Script help

hello,

I have a fixed length file that has the following format

yyyymmdd X 99999999 9999999 9999999
yyyymmdd X 99999999 9999999 9999999

I have included spaces in the format to delineate the values that I am interested in. However in the actual file there are no spaces, just continguous characters.

Assuming there above values as 5 columns, I need to add column 4 value and column 5 value between the consecutive lines if column 3 value is the same, else just report column 4 and 5 as is.

Any suggestions or ideas are much appreciated. Thanks.
# 2  
Old 04-20-2005
this will be a lot easier if you break down the lines first into distinct columns ...
Code:
for line in `< $file`
do
    col1=`echo $line | cut -c1-8`
    col2=`echo $line | cut -c9`
    col3=`echo $line | cut -c10-17`
    col4=`echo $line | cut -c18-24`
    col5=`echo $line | cut -c25-31`
    echo "$col1 $col2 $col3 $col4 $col5" >> /tmp/$$
done

... and then do your evaluations on the column values after ...

i'm not too sure what you mean by the quote below but it might help if you post a snippet of what you think the output should look like and elaborate more on the condition you want to test ...

"Assuming there above values as 5 columns, I need to add column 4 value and column 5 value between the consecutive lines if column 3 value is the same, else just report column 4 and 5 as is."

Last edited by Just Ice; 04-20-2005 at 06:39 PM.. Reason: need to put $ sign
# 3  
Old 04-21-2005
i'm not too sure what you mean by the quote below

"Assuming there above values as 5 columns, I need to add column 4 value and column 5 value between the consecutive lines if column 3 value is the same, else just report column 4 and 5 as is."[/QUOTE]

Thank you for the reply.
what I had intended to say was "Assuming the above values as 5 individual columns, I need to add column 4 in line 1 and line 2 and column 5 in line 1 and line 2 if column 3 value is the same between line 1 and line 2. If not I need to report just column 4 and column 5 value as is"

does this make sense.
I am trying to use an awk program, however I am not sure if how to handle fixed width files with no delimiters. I think this can be overcome with FIXEDWIDTHFIELDS keyword to indicate the size of each field in the fixed width record.
The other issue that I have is to only print a record after adding the values between line 1 and line 2 when the column 3 match value between the lines.

Here is the awk program

BEGIN { FIELDWIDTHS="6 1 8 7 7"}
{supplier = substr($0,8,8)
asnerror = substr($0,17,7)
asntotal = substr($0,18,7)
if (supplier == $3) {
asnerror = asnerror + $4; asntotal = asntotal + $5; NEXT
}
else {print supplier" "asnerror" "asntotal; supplier = $3; asnerror = $4; asntotal = $5 }
}

and the call to this program is like awk -f getfields supplier="" 230240.sort

the input file 230240.sort is as follows ( I messed up the column widths when I posted for the first time)

yyyymm-A-99999999-9999999-999999

200503P0118500100000100000000
200503P0118500100000100000000
200503P0119000100000300000001
200503P0119000100000300000001
200503P0119900100000100000000
200503P0119900100000100000000
200503P0119900300000020000000
200503P0119900300000020000000

I dont think the program I have listed above provides the necessary results. Any thoughts/suggesstions to make this awk program is much appreciated. Thanks.

Last edited by jerardfjay; 04-22-2005 at 10:20 AM..
# 4  
Old 04-21-2005
what is the desired result based on the posted sample input?
# 5  
Old 04-21-2005
Desired output

The desired output should be

200503P0118500100000200000000
200503P0119000100000600000002
200503P0119900100000200000000
200503P0119900300000040000000

Thanks
# 6  
Old 04-23-2005
one way of doing it (revised on 05/10/2005)

For those of you who took the time to read my post, thank you and here is one way of doing it. Although I would have preferred to use awk for this task (due to my limited awk exposure) I had to use regular shell scripting to achieve my goal (thnx to JustIce for showing me how to convert this to a delimited file). Here goes.

#! /usr/bin/ksh

#Typecast the count variables as integers
typeset -i prev_asnerror
typeset -i prev_asntotal
typeset -i curr_asnerror
typeset -i curr_asntotal
typeset -i print_asnerror
typeset -i print_asntotal

#Initialize all temporary files required for merge process
> ./asn2spr.d 2>/dev/null
> ./asn2spr.sort 2>/dev/null
> ./asn2spr 2>/dev/null
> ./230240.txt

# Assuming the data files are all present in the 240 folder
cat 230.txt 240.txt >> asn2spr #Combine 230 and 240 files together
sort asn2spr > asn2spr.sort #Sort the combined file to get input data sorted by Supplier and location

for line in `< asn2spr.sort`
do
col1=`echo $line | cut -c1-6`
col2=`echo $line | cut -c7`
col3=`echo $line | cut -c8-15`
col4=`echo $line | cut -c16-22`
col5=`echo $line | cut -c23-29`
echo "$col1|$col2|$col3|$col4|$col5" >> asn2spr.d #Create the Delimited temporary file of the input data
done

first=1
supplier_match=0
while read line
do
if [ "$first" -eq "1" ] ;
then first=0
prev_header=`echo $line|awk -F "|" '{print $1$2}'`
prev_supplier=`echo $line|awk -F "|" '{print $3}'`
prev_asnerror=`echo $line|awk -F "|" '{print $4}'`
prev_asntotal=`echo $line|awk -F "|" '{print $5}'`
# Set the print columns for the first read
print_asnerror=`echo $line|awk -F "|" '{print $4}'`
print_asntotal=`echo $line|awk -F "|" '{print $5}'`
continue

fi
curr_supplier=`echo $line|awk -F "|" '{print $3}'`
curr_asnerror=`echo $line|awk -F "|" '{print $4}'`
curr_asntotal=`echo $line|awk -F "|" '{print $5}'`
if [ "$prev_supplier" -eq "$curr_supplier" ] ;
then
supplier_match=1
print_asnerror=`expr $prev_asnerror \+ $curr_asnerror`
print_asntotal=`expr $prev_asntotal \+ $curr_asntotal`
else
# Set the print values for the previous record
if [ "$supplier_match" -eq "0" ] ;
then
print_asnerror=$prev_asnerror
print_asntotal=$prev_asntotal
fi

printf "%7s %8s %07d %07d\n" $prev_header $prev_supplier $print_asnerror $print_asntotal | sed 's/ //g' >> 230240.txt
prev_supplier=`echo $line|awk -F "|" '{print $3}'`
prev_asnerror=`echo $line|awk -F "|" '{print $4}'`
prev_asntotal=`echo $line|awk -F "|" '{print $5}'`
let print_asnerror=0
let print_asntotal=0
supplier_match=0
fi
done < asn2spr.d
# Set the print values for the previous record for last record
if [ "$supplier_match" -eq "0" ] ;
then
print_asnerror=$prev_asnerror
print_asntotal=$prev_asntotal
fi

printf "%7s %8s %07d %07d\n" $prev_header $prev_supplier $print_asnerror $print_asntotal | sed 's/ //g' >> 230240.txt
rm -f ./asn2spr.d 2>/dev/null
rm -f ./asn2spr.sort 2>/dev/null
rm -f ./asn2spr 2>/dev/null

Thanks
Jerardfjay

Last edited by jerardfjay; 05-10-2005 at 10:40 AM.. Reason: Buggy Code (last revision)
Login or Register to Ask a Question

Previous Thread | Next Thread

5 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to block first bash script until second bash script script launches web server/site?

I'm new to utilities like socat and netcat and I'm not clear if they will do what I need. I have a "compileDeployStartWebServer.sh" script and a "StartBrowser.sh" script that are started by emacs/elisp at the same time in two different processes. I'm using Cygwin bash on Windows 10. My... (3 Replies)
Discussion started by: siegfried
3 Replies

2. Shell Programming and Scripting

Shell script works fine as a standalone script but not as part of a bigger script

Hello all, I am facing a weird issue while executing a code below - #!/bin/bash cd /wload/baot/home/baotasa0/sandboxes_finance/ext_ukba_bde/pset sh UKBA_publish.sh UKBA 28082015 3 if then echo "Param file conversion for all the areas are completed, please check in your home directory"... (2 Replies)
Discussion started by: ektubbe
2 Replies

3. UNIX for Dummies Questions & Answers

Calling a script from master script to get value from called script

I am trying to call a script(callingscript.sh) from a master script(masterscript.sh) to get string type value from calling script to master script. I have used scripts mentioned below. #masterscript.sh ./callingscript.sh echo $fileExist #callingscript.sh echo "The script is called"... (2 Replies)
Discussion started by: Raj Roy
2 Replies

4. Shell Programming and Scripting

Script will keep checking running status of another script and also restart called script at night

I am using blow script :-- #!/bin/bash FIND=$(ps -elf | grep "snmp_trap.sh" | grep -v grep) #check snmp_trap.sh is running or not if then # echo "process found" exit 0; else echo "process not found" exec /home/Ketan_r /snmp_trap.sh 2>&1 & disown -h ... (1 Reply)
Discussion started by: ketanraut
1 Replies

5. Shell Programming and Scripting

create a shell script that calls another script and and an awk script

Hi guys I have a shell script that executes sql statemets and sends the output to a file.the script takes in parameters executes sql and sends the result to an output file. #!/bin/sh echo " $2 $3 $4 $5 $6 $7 isql -w400 -U$2 -S$5 -P$3 << xxx use $4 go print"**Changes to the table... (0 Replies)
Discussion started by: magikminox
0 Replies
Login or Register to Ask a Question