Tricky Shell script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Tricky Shell script
# 29  
Old 08-16-2007
Script

Check if this works

Code:
#!/bin/ksh

inpFile=$1
outFile="$HOME/Output.txt"

tmpFile1="/tmp/sample1.txt"
tmpFile2="/tmp/sample2.txt"
sortFile="/tmp/sortfile.txt"
TOTAL_FILEDS=9
COUNT=1
rm -f $outFile
for line in $(cat $inpFile)
do
        count_fields=$(echo $line | sed "s/00,*//g;s/,$//g" | wc -c)
        cnt_flds1=$(echo $line | cut -d',' -f1-9 | sed "s/00,*//g;s/,$//g" | wc -c )
        cnt_flds2=$(echo $line | cut -d',' -f10-18 | sed "s/00,*//g;s/,$//g" | wc -c )
        cnt_flds3=$(echo $line | cut -d',' -f19-27 | sed "s/00,*//g;s/,$//g" | wc -c )
        if [[ $count_fields -eq 45 && $cnt_flds1 -eq 15 && $cnt_flds2 -eq 15 && $cnt_flds3 -eq 15 ]]
        then
                echo $line >> $outFile
        fi
done
if [[ ! -s $outFile ]]
then
        echo "No output file is created!!! Check your input file"
        exit 126
fi

while read sort_line
do
     echo $sort_line | cut -d',' -f1-9 > $sortFile
     echo $sort_line | cut -d',' -f10-18 >> $sortFile
     echo $sort_line | cut -d',' -f19-27 >> $sortFile
     cat $sortFile
     while [[ $COUNT -le $TOTAL_FILEDS ]]
     do
          cut -d',' -f$COUNT $sortFile | grep -v 00 > $tmpFile1
          cut -d',' -f$COUNT $sortFile | grep -v 00 | sort > $tmpFile2
          diff $tmpFile1 $tmpFile2 > /dev/null
          if [[ $? -eq 1 || ! -s $tmpFile1 ]]
          then
                  echo "Check the $COUNT field of the line: $sort_line"
                  rm -f $outFile
                  exit 256
          fi
        COUNT=$((COUNT+1))
     done
     COUNT=1
done < $outFile
echo "Success.... Check the output in $outFile"
rm -f $tmpFile1 $tmpFile2 $sortFile

Input File
Code:
00,11,21,00,00,55,00,73,83,07,00,22,39,43,00,00,00,05,05,15,00,00,44,58,67,00,00
02,14,24,30,00,00,00,70,00,00,00,00,32,47,50,60,74,00,04,16,27,38,00,00,00,00,89
00,00,00,00,42,52,61,71,86,01,00,29,33,00,59,00,75,00,03,19,00,00,45,00,68,00,88
00,13,20,31,00,00,64,76,00,05,00,00,35,41,56,00,00,81,00,00,28,00,00,57,65,79,90
06,10,00,36,40,00,00,00,80,00,12,25,00,00,51,62,72,00,09,00,00,37,49,00,69,00,84
00,17,23,00,46,53,00,77,00,08,00,00,34,00,54,00,78,82,00,18,26,00,48,00,63,00,85
00,14,23,39,00,00,60,00,87,02,00,28,00,41,50,00,75,00,03,15,00,00,44,00,68,00,90
00,16,25,35,00,53,00,71,00,08,00,00,36,40,00,62,00,88,00,00,27,37,00,58,64,78,00
05,10,00,00,48,52,00,73,00,00,00,24,31,00,57,66,00,81,07,17,00,00,49,00,00,79,85
00,00,20,33,00,00,63,70,80,06,12,00,34,42,56,00,00,00,00,00,29,00,00,59,69,74,86
04,13,00,32,43,00,65,00,00,00,18,22,00,00,55,00,72,84,09,00,00,38,47,00,67,00,89
01,11,21,00,00,51,00,76,00,00,00,26,30,45,54,00,00,82,00,19,00,00,46,00,61,77,83
06,11,22,00,00,00,64,00,81,00,00,00,30,40,56,00,79,85,08,15,27,35,00,59,00,00,00

Tests:
Code:
$ >ksh final.ksh input
00,11,21,00,00,55,00,73,83
07,00,22,39,43,00,00,00,05
05,15,00,00,44,58,67,00,00
Check the 1 field of the line: 00,11,21,00,00,55,00,73,83,07,00,22,39,43,00,00,00,05,05,15,00,00,44,58,67,00,00

We can re-work on the code if it is logical correct as per your req
# 30  
Old 08-16-2007
CPU & Memory

Quote:
Originally Posted by Perderabo
My script already checks for that..if I understand what you mean...

Code:
#
# check for ascending columns

        nitem=0
        error=0
        set -A cols 0 0 0 0 0 0 0 0 0
        while ((nitem < 9)) ; do
                if ((${ticket1[nitem]})) ; then
                        cols[nitem]=${ticket1[nitem]}
                fi
                if ((${ticket2[nitem]})) ; then
                        ((${ticket2[nitem]} < ${cols[nitem]})) && error=1
                        cols[nitem]=${ticket2[nitem]}
                fi
                if ((${ticket3[nitem]})) ; then
                        ((${ticket3[nitem]} < ${cols[nitem]})) && error=1
                fi
                ((nitem=nitem+1))
        done
        if ((error)) ; then
                echo error line $lineno does not have ascending columns:
                echo $line
                echo "${ticket1[*]}"
                echo "${ticket2[*]}"
                echo "${ticket3[*]}"
                echo
        fi

Note that I explicitly ignore zeros during this check...only non-zeros are required to ascend in columns. I think that is what you wanted.

Yes Perdarabo that is there but i did not understand it fully,how you are using the input file for this.Your script checks for all the things which i need in my script.

suppose my input file is testingdata.txt then how u r going to run this.when i ran the script it tells ./script[3] : data can not open.
Suggest me something.
# 31  
Old 08-16-2007
Perdarabo has hardcoded the input file as data(3rd line) in the code, So copy your input file as data and then try this script.
# 32  
Old 08-16-2007
Quote:
Originally Posted by lorcan
Perdarabo has hardcoded the input file as data(3rd line) in the code, So copy your input file as data and then try this script.
or change the line
exec < data
to
exec < testingdata.txt

or change it to:

exec < $1

and then pass the name of file as an argument

or eliminate the line entirely and redirect the input
# 33  
Old 08-16-2007
MySQL

lorcan,
That is working perfectlly fine.

I appericiate your help.

Thanks
Namish
# 34  
Old 08-16-2007
CPU & Memory

Quote:
Originally Posted by Perderabo
or change the line
exec < data
to
exec < testingdata.txt

or change it to:

exec < $1

and then pass the name of file as an argument

or eliminate the line entirely and redirect the input
Ok I got it,but when i ran the script with the changed name of the input file it gave me an error

./script
./script[82]: item: bad number

The change i did in the script is only this

exec < testingdata

The requiremnt is a bot diffrent,i am mentioning the points for you..

# scan the 27 data items to make sure they are numbers
# and remove leading zeros while we are at it

This req is like this---

1... We are not bothered about the leading zeroes ie 01,02,03-------------- In my requirement they all are valid numbers,we should ignore the zeroes only ie 00 where ever they are,they are just for filling purpose dont have any meaning.

2..# note each column with a non-zero--

here leading zero is fine ie 01,02,03----- they are fine.Here i need to check that the colums must have a valid number and if more than that numbers are there then it should be in ascending order,if not the data is ascending order in column it should print that data as an error.

3. There should be 27 entries in a row that is fine but in that there must be exactly 15 numbers leaving all 00.

Your apporoach to the requirement is very correct but just some changes.Rest of the code is fullfilling the requirement.I am new to shell script.

Thanks
Namish

Last edited by namishtiwari; 08-16-2007 at 08:23 AM..
# 35  
Old 08-16-2007
Modified script

Code:
#!/bin/ksh

inpFile=$1
outFile="$HOME/Output.txt"

tmpFile1="/tmp/sample1.txt"
tmpFile2="/tmp/sample2.txt"
sortFile="/tmp/sortfile.txt"

TOTAL_FILEDS=9
COUNT=1
rm -f $outFile

for line in $(cat $inpFile)
do
        count_fields=$(echo $line | sed "s/00,*//g;s/,$//g" | wc -c)
        cnt_flds1=$(echo $line | cut -d',' -f1-9 | sed "s/00,*//g;s/,$//g" | wc -c )
        cnt_flds2=$(echo $line | cut -d',' -f10-18 | sed "s/00,*//g;s/,$//g" | wc -c )
        cnt_flds3=$(echo $line | cut -d',' -f19-27 | sed "s/00,*//g;s/,$//g" | wc -c )
        if [[ $count_fields -eq 45 && $cnt_flds1 -eq 15 && $cnt_flds2 -eq 15 && $cnt_flds3 -eq 15 ]]
        then
                echo $line | sed "s/\(.\{26\}\),\(.\{26\}\),\(.\{26\}\).*/\1\n\2\n\3/g" > $sortFile
                while [[ $COUNT -le $TOTAL_FILEDS ]]
                do
                        cut -d',' -f$COUNT $sortFile | grep -v 00 > $tmpFile1
                        cut -d',' -f$COUNT $sortFile | grep -v 00 | sort > $tmpFile2
                        diff $tmpFile1 $tmpFile2 > /dev/null
                        if [[ $? -eq 1 || ! -s $tmpFile1 ]]
                        then
                                echo "Check the $COUNT field of the line: $line"
                                rm -f $tmpFile1 $tmpFile2 $sortFile
                                exit 256
                        fi
                COUNT=$((COUNT+1))
                done
                echo $line # >> $outFile
        fi
        COUNT=1
done
rm -f $tmpFile1 $tmpFile2 $sortFile
exit 0

Hope your req is complete Smilie
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Parsing xml - tricky one...need help!!

Hi, i am new to linux programming fraternity but looks like starting with a big thing... yes..xml parsing (it is indeed tough for a beginner like me) so need your kind help... The snippet of xml looks like: <snapshot> <tag1> <key>1234</key> <keytype>abcd</keytype> </tag1> <tag2>... (11 Replies)
Discussion started by: rookie2014
11 Replies

2. Shell Programming and Scripting

Tricky sed required

Hi All I need to put some sed together for a task and its a bit advanced for me, so I thought I'd ask if anyone here could help. I have a csv file with content like this - "","abcde","","" "'","abcde","","" "","","","1234" "'e'","","","" I need to remove any single quotes that fall... (17 Replies)
Discussion started by: steadyonabix
17 Replies

3. Solaris

Tricky egrep

Hi folks! My first post here. I'm working on a script that retrieves a range of files from a list depending on a range of time. UPDATE: I've seen it could be difficult to read all this thing, so I'll make a summarize it.. How come I do this and take a result.. grep "..\:.." lista.new |... (4 Replies)
Discussion started by: kl0x
4 Replies

4. Shell Programming and Scripting

Tricky data manipulation...

Hi everyone.. I am new here, hello.. I hope this doesn't come across to you folks as a stupid question, I'm somewhat new to scripting :) I'm seeking some help in finding a way to manipulate data output for every two characters - example: numbers.lst contains the following output:... (3 Replies)
Discussion started by: explicit
3 Replies

5. Shell Programming and Scripting

Tricky - Need help on Shell script variables

Hi, I have a requirement in which i have to read a csv file and put data in certain set of variables: File content: VP-DTL-REC-CNT, ,854840,0.00,VP-PAID-AMT, ,0,32280885.17,VP-PAT-PAID-AMT, ,0,9930244.32,VP-PAID-REV-CNT, ,484927,0.00,VP-REJ-CNT, ,369913,0.00, , ,0,0.00, , ,0,0.00, , ,0,0.00, ,... (3 Replies)
Discussion started by: shantoshkumar
3 Replies

6. Shell Programming and Scripting

Linux: Writing a tricky script to check connectivity

So, first and foremost, I'm having issues with my internet connection. Periodically, the connection drops across the network. The fix is simple enough: restart the modem. However, this gets old when the connection dies out every hour. I can hit my surfboard on 192.168.100.1, and navigate to a... (5 Replies)
Discussion started by: kungfujoe
5 Replies

7. UNIX for Dummies Questions & Answers

Tricky Quotation Question

Hi, I am at a point in my script where I defined the number of the command line parameter I would like to set a variable equal to: parameter_number=14 I would then like to set a variable equal to the correct parameter: variable=$parameter_number The issue here is that {} is required... (2 Replies)
Discussion started by: msb65
2 Replies

8. Shell Programming and Scripting

Tricky script question

Hi, I'm in the midst of writing a UNIX script that sftp's files to an external host and am stuck with a problem. The problem is that the files created on my server as a order number that correlates to a sequence of directories on the remote host which is where the file should be ftp'ed. ... (3 Replies)
Discussion started by: budrito
3 Replies

9. Shell Programming and Scripting

Tricky Sed

Hello. I am trying to convert occurrences of 'NULL' from a datafile. The 'NULL' occurences appears at this: |NULL| NULL|NULL| NULL|NULL| NULL|NULL| NULL| There should be 52 fields per line. I would like any occurrence of | NULL| or |NULL| to appear as '||' Currently I am using this sed... (2 Replies)
Discussion started by: bestbuyernc
2 Replies

10. Windows & DOS: Issues & Discussions

Tricky one...

Here's my problem: I have a laptop running Windows XP Pro with no internal CD or Floppy drives. I want to install Linux on it. I don't care about the Windows XP Pro installation, in fact I would like to install Linux over the entirety of the HD. However I cannot boot from any external CD drive... (1 Reply)
Discussion started by: saabir
1 Replies
Login or Register to Ask a Question