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


Login or Register for Dates, Times and to Reply

 
Thread Tools Search this Thread
# 1  
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  
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  
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  
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 05:24 AM..
# 5  
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  
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 08:01 AM..
# 7  
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 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 #271
Difficulty: Easy
While working at Bletchley Park, in the first week of June each year Alan Turing would get a bad attack of hay fever, and he would cycle to the office wearing a service gas mask to keep from breathing pollen. In the first week of June each year he would get a bad attack of hay fever, and he would cycle to the office wearing a service gas mask to keep from breathing the pollen.
True or False?

9 More Discussions You Might Find Interesting

1. 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

2. 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

3. 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

4. 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

5. 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

6. 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

7. UNIX for Dummies Questions & Answers

need help sorting/deleting non-unique things

I don't really know much about UNIX commands, so if someone could help me understand how to do this, I'd really appreciate it. I have a text file with data that looks like this (filename: numbers.txt): 1 1 1 1 1 1 1 1 1 2 1 1_2 2_1 1 1 1 1 1 1 1 1 2 1 2 1_2 2_1 1 1 1 1 1 1 1 1 2 1 2 1_2 2_1... (12 Replies)
Discussion started by: zac100
12 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

Featured Tech Videos