Need help comparing two files and deleting some things in those files!


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Need help comparing two files and deleting some things in those files!
# 1  
Old 07-20-2010
Error Need help comparing two files and deleting some things in those files!

So I have two files:

File1
Code:
pictures.txt 1.1 1.3
dance.txt 1.2 1.4
treehouse.txt 1.3 1.5

File2
Code:
pictures.txt 1.5 ref2313 1.4 ref2345 1.3 ref5432 1.2 ref4244
dance.txt 1.6 ref2342 1.5 ref2352 1.4 ref0695 1.3 ref5738 1.2 ref4948 1.1
treehouse.txt 1.6 ref8573 1.5 ref3284 1.4 ref5838 1.3 ref4738 1.2 ref4573 1.1


The numbers (i.e. 1.1 1.4) are the file version numbers, with the reference numbers coming after them (version 1.1 has no reference number). What I want is the file and the version number to be printed into a file between the two version numbers in shown in file1. So the output should be:

Code:
pictures.txt 1.3 ref5432 1.2 ref4244 1.1
dance.txt 1.4 ref0695 1.3 ref5738 1.2 ref4948
treehouse.txt 1.5 ref3284 1.4 ref5838 1.3 ref4738

I realise this is a bit complicated, so any help will be much appreciated.
# 2  
Old 07-20-2010
How about:

Code:
awk 'BEGIN{
    while ((getline < "two") > 0) {
        for(i=2;i < NF;i+=2) {
            refs[$1 "--" $i] = $(i+1)
        }
    }
}{
    out=""
    for(r in refs) {
        split(r, keys,"--")
        if(keys[1] == $1 && keys[2] >= $2 && keys[2] <= $3) {
            out=keys[2] " " refs[r] " " out
        }
    }
    printf("%s %s\n",$1,out)
}'

the second file has a hard-coded file name of "two" and you pipe file "one" into it.
# 3  
Old 07-20-2010
Seems the for loop in awk has bug? for first awk, i expect to get 4 output: 1.5, 1.4, 1.3, 1.2, but there are only 3.

Code:
$ awk 'BEGIN {for (i=1.5;i>=1.2;i-=0.1) print i}'
1.5
1.4
1.3

$ awk 'BEGIN {for (i=15;i>=12;i-=1) print i}'
15
14
13
12

For below code, last one is missed.
Code:
$ awk 'NR==FNR {for (i=2;i<=NF;i+=2) a[$1 FS $i]=$(i+1) ;next}
     {printf $1 FS} {for (i=$3;i>=$2;i-=0.1) printf i FS a[$1 FS i] FS}{printf "\n"}' File2 File1

pictures.txt 1.3 ref5432 1.2 ref4244
dance.txt 1.4 ref0695 1.3 ref5738
treehouse.txt 1.5 ref3284 1.4 ref5838

Can anyone help to check?
# 4  
Old 07-21-2010
Quote:
Originally Posted by citaylor
How about:

Code:
awk 'BEGIN{
    while ((getline < "two") > 0) {
        for(i=2;i < NF;i+=2) {
            refs[$1 "--" $i] = $(i+1)
        }
    }
}{
    out=""
    for(r in refs) {
        split(r, keys,"--")
        if(keys[1] == $1 && keys[2] >= $2 && keys[2] <= $3) {
            out=keys[2] " " refs[r] " " out
        }
    }
    printf("%s %s\n",$1,out)
}'

the second file has a hard-coded file name of "two" and you pipe file "one" into it.
When you say pipe the file into it, do you mean like
Code:
file1 | awk....

?

Last edited by linuxkid; 07-21-2010 at 04:24 AM..
# 5  
Old 07-21-2010
Create a file with "#!/bin/sh" at the top, and the awk script as the rest of it, and then:
Code:
cat file1 | awkscript

# 6  
Old 07-21-2010
Quote:
Originally Posted by rdcwayx
Seems the for loop in awk has bug? for first awk, i expect to get 4 output: 1.5, 1.4, 1.3, 1.2, but there are only 3.

Code:
$ awk 'BEGIN {for (i=1.5;i>=1.2;i-=0.1) print i}'
1.5
1.4
1.3
 
$ awk 'BEGIN {for (i=15;i>=12;i-=1) print i}'
15
14
13
12

For below code, last one is missed.
Code:
$ awk 'NR==FNR {for (i=2;i<=NF;i+=2) a[$1 FS $i]=$(i+1) ;next}
     {printf $1 FS} {for (i=$3;i>=$2;i-=0.1) printf i FS a[$1 FS i] FS}{printf "\n"}' File2 File1
 
pictures.txt 1.3 ref5432 1.2 ref4244
dance.txt 1.4 ref0695 1.3 ref5738
treehouse.txt 1.5 ref3284 1.4 ref5838

Can anyone help to check?
Could we work around the problem using a "do" statement?

Also I tried the code but it prints out the file with the version numbers first, without the last one as you pointed out, but then after that it prints out all the files again but with the first reference number only :s I tried putting /usr/bin/nawk instead of awk but still no luck Smilie

---------- Post updated at 11:18 AM ---------- Previous update was at 10:55 AM ----------

Quote:
Originally Posted by citaylor
Create a file with "#!/bin/sh" at the top, and the awk script as the rest of it, and then:
Code:
cat file1 | awkscript

Didn't work Smilie

Last edited by linuxkid; 07-21-2010 at 07:01 AM..
# 7  
Old 07-21-2010
Will the versions always be a normal floating point value ?
For example 1.1, 1.2, etc ?
Or could you have 1.1.1, 1.1.2 ?
If it is the former we could use a numerical loop, otherwise you will have to use multiple nested loops to loop through from the minimum to the maximum version number.
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Comparing two files and list the difference with common first line content of both files

I have two file as given below which shows the ACL permissions of each file. I need to compare the source file with target file and list down the difference as specified below in required output. Can someone help me on this ? Source File ************* # file: /local/test_1 # owner: own #... (4 Replies)
Discussion started by: sarathy_a35
4 Replies

2. Shell Programming and Scripting

Trying to make a bash script that goes through directory files and changes things

I'm trying to write a script in a directory that goes through the column the user specifies of 4 files that are inside the directory and calculates the min and the max values. This means that if the user specifies column 5, the script will go through column 5 of all 4 files and all that should give... (2 Replies)
Discussion started by: Eric1
2 Replies

3. Shell Programming and Scripting

Bash script deleting my files, and editing files in subdirectories question

#!/bin/bash # name=$1 type=$2 number=1 for file in ./** do if then filenumber=00$number elif then filenumber=0$number fi tempname="$name""$filenumber"."$type" if (4 Replies)
Discussion started by: TheGreatGizmo
4 Replies

4. Shell Programming and Scripting

Comparing files in a directory against an array of files

I hope I can explain this correctly. I am using Bash-4.2 for my shell. I have a group of file names held in an array. I want to compare the names in this array against the names of files currently present in a directory. If the file does not exist in the directory, that is not a problem.... (5 Replies)
Discussion started by: BudMan
5 Replies

5. UNIX for Advanced & Expert Users

How to find duplicates contents in a files by comparing other files?

Hi Guys , we have one directory ...in that directory all files will be set on each day.. files must have header ,contents ,footer.. i wants to compare the header,contents,footer ..if its same means display an error message as 'files contents same' (7 Replies)
Discussion started by: Venkatesh1
7 Replies

6. Shell Programming and Scripting

Comparing the matches in two files using awk when both files have their own field separators

I've two files with data like below: file1.txt: AAA,Apples,123 BBB,Bananas,124 CCC,Carrot,125 file2.txt: Store1|AAA|123|11 Store2|BBB|124|23 Store3|CCC|125|57 Store4|DDD|126|38 So,the field separator in file1.txt is a comma and in file2.txt,it is | Now,the output should be... (2 Replies)
Discussion started by: asyed
2 Replies

7. Shell Programming and Scripting

AIX system.... deleting files in remote directory after retrieving files

Hi Friends, I am new to this , I am working on AIX system and my scenario is to retrive the files from remote system and remove the files from the remote system after retreving files. I can able to retrieve the files but Can't remove files in remote system. Please check my code and help me out... (3 Replies)
Discussion started by: vinayparakala
3 Replies

8. UNIX for Dummies Questions & Answers

Deleting the files comparing the creation dates

Hi Gurus, I am new to unix. I have a requirement where i need to delete some files in a folder twice a week. Suppose i have a folder AAA. In that i have files from 01/04/2008 to 10/04/2008 I want to remove all the files except last 3 days i.e., 10,9th & 8th. Every week twice we want to... (2 Replies)
Discussion started by: pssandeep
2 Replies

9. UNIX for Advanced & Expert Users

comparing shadow files with real files

Hi I need to compare shadow file sizes with their real file counterparts. If the shadow file size differs form the realfile size then it must send a mail. My problem is that our system has over 1600 shadowfiles in different directories, with different names. the only consistancy is the .sh file... (4 Replies)
Discussion started by: terrym
4 Replies
Login or Register to Ask a Question