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.
this will be a lot easier if you break down the lines first into distinct columns ...
... 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
"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.
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..
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.
#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)
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)
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)
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)
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)
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)