Problem with awk and if statement


Login or Register for Dates, Times and to Reply

 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Problem with awk and if statement
# 1  
Problem with awk and if statement

Hi,
I have a task where i need to compare columns of two files.

First file is $REG_InputFileName:

"UPDATE","1010021126","1-01-01","USD"
"UPDATE","1013000101","1-01-01","THB"
"UPDATE","1013010107","1-01-01","THB"
"UPDATE","1110011122","1-01-01","USD"
"UPDATE","1110020111","1-01-01","THB"
"UPDATE","1110020111","1-01-01","USD"
"UPDATE","1110020113","1-01-01","THB"
"UPDATE","1620020409","1-01-01","USD"
"UPDATE","1620020612","1-01-01","USD"
"UPDATE","1620021126","1-01-01","USD"
"UPDATE","1910020411","1-01-01","USD"
"UPDATE","1910020722","1-01-01","USD"
"UPDATE","1910030021","1-01-01","THB"
"UPDATE","1910031191","1-01-01","THB"
"UPDATE","1910031221","1-01-01","THB"
"UPDATE","2620021162","1-01-01","USD"


Second file is $TargetSeqPath/Ref.tmp:

001.,ARE
002.,ARE
003.,ARE
011.,ARE
012.,ARE
021.,BHR
031.,BHR
041.,QAT
043.,QAT
051.,QAT
061.,OMN
071.,OMN
081.,LBN
091.,LBN
101.,JOR
111.,JOR
121.,EGY
131.,EGY
141.,MUS
151.,MUS
162.,IRQ
181.,PAK
191.,PAK


In this, i need to compare first three characters of 2nd column of $REG_InputFileName with first 3 characters 1st column of $TargetSeqPath/Ref.tmp

if there is match then the whole record should go to a file which is in the directory named same as second column of $TargetSeqPath/Ref.tmp

for e.g.

first record of $REG_InputFileName is

"UPDATE","1010021126","1-01-01","USD"
so first three characters will be 101 now i need to lookup this 101 into $TargetSeqPath/Ref.tmp and there is match ;
001.,ARE

then this whole record "UPDATE","1010021126","1-01-01","USD" should go to a directory named as ARE

i have following code for this :

while read i
do
echo $i > $TargetSeqPath/Ref.tmp
OutDir=`awk -F"," '{print $2}' $TargetSeqPath/Ref.tmp`
awk -F"," 'NR==FNR {col1[substr($1,1,3)]=$2} NR!=FNR { if (col1[substr($2,2,3)]=="") {next} print $0}' $TargetSeqPath/Ref.tmp $REG_InputFileName >>$Target
SeqPath/$OutDir/$OutFile-$mdt.txt
done < $RefInputFileName


this is code is working fine and i am getting everything mentioned above. But the problem is if there is match.
for e.g.

"UPDATE","2620021162","1-01-01","USD"

then this record should go to a directory named as "others"

Can anybody help me how to check this mismatch and send the record to other directory

Thanks
# 2  
Assuming only one record per type (except for others).

Use nawk or /usr/xpg4/bin/awk on Solaris.
You may need to adjust the names of the files.

Code:
awk 'NR == FNR { ref[$1] = $2; next }
{ 
  if (substr($2, 1, 3) in ref) { 
    dest = ref[substr($2, 1, 3)] "/"
    system("[ -d " dest " ] || mkdir " dest) 
    print > (dest FILENAME)
    close(dest FILENAME)
    }
  else {
    dest = "others/"
    system("[ -d " dest " ] || mkdir " dest)
    print > (dest FILENAME)
    }
}' FS='[.],' Ref.tmp FS='","' REG_InputFileName

# 3  
Hi,
Thanx for helping me out...
actually i am new at scripting ...can you explain me a liitle bit what your code is doing?? so that if at sometime i need to make changes in it...i can make..
# 4  
Yes,
while reading the first input file build an associative array ref keyed by the first field with values from the second one. You should add more control here: I'm assuming that the second field is always present and that it does not contain special (for the shell) characters.
While reading the second input file check if the first 3 characters match any ref key, if yes: checks if a directory with that name already exists, if not creates it. Then prints the current record in a file named as the second input filename in that directory; if not: does the same for the others directory.

Hope this helps.
# 5  
Hi Radoulov,
Thanks for the explanation. i understand it now....but your code is not working ..it's giving me error while fetching every record:

Quote:
Syntax Error The source line is 1.
The error context is
NR == FNR { ref[$1] = $2; next } { if (substr($2, 1, 3) in ref) { dest = ref[substr($2, 1, 3)] "/" system("[ -d " dest " ] || mkdir -p " dest) >>> print <<< > (dest FILENAME) close(dest FILENAME) } else { dest = "others/" system("[ -d " dest " ] || mkdir -p " dest) print > (dest FILENAME) }}
awk: 0602-502 The statement cannot be correctly parsed. The source line is 1.
dest
# 6  
OK,
could you run the following commands (see example below) with your files and post the entire terminal output?
You should preserve the formatting!

1.
Code:
ls -l

2.
Code:
awk 'NR == FNR { ref[$1] = $2; next }
{ 
  if (substr($2, 1, 3) in ref) { 
    dest = ref[substr($2, 1, 3)] "/"
    system("[ -d " dest " ] || mkdir " dest) 
    print > (dest FILENAME)
    close(dest FILENAME)
    }
  else {
    dest = "others/"
    system("[ -d " dest " ] || mkdir " dest)
    print > (dest FILENAME)
    }
}' FS='[.],' Ref.tmp FS='","' REG_InputFileName

3.
Code:
ls -lR

Something like this:

Code:
% ls -l
total 8
-rw-r--r-- 1 radoulov radoulov 207 2008-11-07 23:09 Ref.tmp
-rw-r--r-- 1 radoulov radoulov 608 2008-11-07 23:08 REG_InputFileName
% 
% 
% awk 'NR == FNR { ref[$1] = $2; next }
{
  if (substr($2, 1, 3) in ref) {
    dest = ref[substr($2, 1, 3)] "/"
    system("[ -d " dest " ] || mkdir " dest)
    print > (dest FILENAME)
    close(dest FILENAME)
    }
  else {
    dest = "others/"
    system("[ -d " dest " ] || mkdir " dest)
    print > (dest FILENAME)
    }
}' FS='[.],' Ref.tmp FS='","' REG_InputFileName
% ls -lR
.:
total 24
drwxr-xr-x 2 radoulov radoulov 4096 2008-11-07 23:09 IRQ
drwxr-xr-x 2 radoulov radoulov 4096 2008-11-07 23:09 JOR
drwxr-xr-x 2 radoulov radoulov 4096 2008-11-07 23:09 others
drwxr-xr-x 2 radoulov radoulov 4096 2008-11-07 23:09 PAK
-rw-r--r-- 1 radoulov radoulov  207 2008-11-07 23:09 Ref.tmp
-rw-r--r-- 1 radoulov radoulov  608 2008-11-07 23:08 REG_InputFileName

./IRQ:
total 4
-rw-r--r-- 1 radoulov radoulov 38 2008-11-07 23:09 REG_InputFileName

./JOR:
total 4
-rw-r--r-- 1 radoulov radoulov 38 2008-11-07 23:09 REG_InputFileName

./others:
total 4
-rw-r--r-- 1 radoulov radoulov 38 2008-11-07 23:09 REG_InputFileName

./PAK:
total 4
-rw-r--r-- 1 radoulov radoulov 38 2008-11-07 23:09 REG_InputFileName
%

Login or Register for Dates, Times and to Reply

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #239
Difficulty: Easy
In March 1970, the ARPANET reached the East Coast of the United States, when an IMP at the Department of Energy in Washington, DC was connected to the network.
True or False?

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Problem with If statement

Hi All, I am writing an if statement to check multiple conditions, but when I try to execute the script it is breaking at the point of if statement by showing the issue below. Code I am using is given below. if -a ] then .... else ... fi I am not understanding... (3 Replies)
Discussion started by: ginrkf
3 Replies

2. Shell Programming and Scripting

Convert Update statement into Insert statement in UNIX using awk, sed....

Hi folks, I have a scenario to convert the update statements into insert statements using shell script (awk, sed...) or in database using regex. I have a bunch of update statements with all columns in a file which I need to convert into insert statements. UPDATE TABLE_A SET COL1=1 WHERE... (0 Replies)
Discussion started by: dev123
0 Replies

3. Shell Programming and Scripting

Awk/sed problem to write Db insertion statement

Hi There, I am trying to load data from a csv file into a DB during our DB migration phase. I am successfully able export all data into a .csv file but those have to rewritten in terms insert statement which will allow for further population of same data in different DB My exiting csv record... (6 Replies)
Discussion started by: bhaskar_m
6 Replies

4. Shell Programming and Scripting

Awk or If/statement Calculation Problem

#!/bin/sh CURRENTSTATE=2 CSVCSTATE=2 LASTSTATECHANGE=8 CSVCSTATEAGE=5 if (($CURRENTSTATE==$CSVCSTATE))&&(($LASTSTATECHANGE>=$CSVCSTATEAGE)) echo GREAT fi returns: ./aff: line 12: syntax error near unexpected token `fi' ./aff: line 12: `fi' what am i doing wrong here? (6 Replies)
Discussion started by: SkySmart
6 Replies

5. Shell Programming and Scripting

while statement problem

Hi, Here is a big head scratcher for me.... I'm creating a loop with while reading lines from a file called example.txt: #!/bin/sh while read line do some command > another file ----- output to another file done < example.txt I would like that another file to be unique for every... (5 Replies)
Discussion started by: svetoslav_sj
5 Replies

6. UNIX for Dummies Questions & Answers

Having problem with if statement

Could someone help me out with this if statement? It's supposed to get a person's website, but it isn't working when I run it. website="" echo "Would you like to enter a website? Enter Yes/No" read choice if then while do echo "Please enter a website:"; read... (4 Replies)
Discussion started by: Sotau
4 Replies

7. Shell Programming and Scripting

if statement problem

Hi I have a bash script like this if then echo "A" else echo "B" fi $1 is something like 02350 (there is always a trailing '0') and I would like to have an if based on the value of the digits after the 0. Can anybody help? Thanks, Sarah (3 Replies)
Discussion started by: f_o_555
3 Replies

8. Shell Programming and Scripting

If Statement Problem..

The problem I am having here is that only the 1st option is executed, no matter if I pick yes or no. What am I doing wrong? How can I get this working right without resorting to a case statement? echo "This is the max size your lvol can be:" echo $MAXSIZE echo echo Do you want to max out... (2 Replies)
Discussion started by: LinuxRacr
2 Replies

9. UNIX for Dummies Questions & Answers

if statement problem

hi all. i just have a very small problem. i have a menu of 7 choices. i want an if statement so that if the user chooses anything except inside the 1 to 7 range, i can handle the error for it. i tried this: if ] then ....... fi (but it dont work) ...any suggestions? ... (4 Replies)
Discussion started by: djt0506
4 Replies

10. UNIX for Dummies Questions & Answers

if statement problem

I keep getting an error at line 21, it doesn't like my if statement. Previously I have tried using (( )), but still get errors. The current error is that server_busy is not found. This is the script: #! /bin/ksh server_busy="na" for file in $1 $2 $3 $4 $5 $6 do echo " ${file}\t\c" ... (1 Reply)
Discussion started by: coughlin74
1 Replies

Featured Tech Videos