user7083883
user7083883

Reputation: 29

Use awk to compare file entry as well as condition

I have a file1 in the below format:

14-02-2017

one 01/02/2017
two 31/01/2017
three 14/02/2017
four 01/02/2017
five 03/02/2017
six 01/01/2017

And file2 in the below format:

11-02-2017

one 01/01/2017
two 31/01/2017
three 14/02/2017
four 11/01/2017

Requirement : I want to copy, replace (or add if necessary) those files mentioned file1 from some location to the location where file2 resides, whose date (in coulmn 2) is greater than the date mentioned in file 2. It is guaranteed that under no circumstances the file 2 will have a program's date greater than that of file one (but can be equal). Also the file entries missing in file 2 (but present in file 1) shall also be copied.

So that in this case, the files one, four, five and six shall be copied from some location to the file2 location, after the script execution

awk -F' ' 'NR==FNR{c[$1]++;next};c[$1] > 0' $file2 $file1 > common

# File 1, column 2 f1c2=($(cut -f2 -s $common))

# File 2, column 2 f2c2=($(cut -f2 -s $file2))

for x in "${f1c2[@]}"
do
    for y in "${f2c2[@]}"
    do
        if [[ $x >= $y ]]
        then

    //copy file pointed by field $1 in "common" to file2 path   

            break
        fi
    done
done

I was thinking of a way to use awk itself efficiently to do the comparison task to create the file "common". So that the file "common" will contain latest files in file 1, plus the missing entries in file 2. Following this way, I just need to copy all files mentioned in the file "common" without any concerns

I was trying to add some if block inside awk -F' ' 'NR==FNR{c[$1]++;next};c[$1] > 0' $file2 $file1 > common, but I couldn't figure out how to address file1 column2 and file 2 column2 for comparing.

Upvotes: 0

Views: 103

Answers (2)

karakfa
karakfa

Reputation: 67497

to get the date compared diff list you can try this

awk 'NR==FNR {a[$1]=$2; next}
     $1 in a {split($2,b,"/"); split(a[$1],c,"/");
              if(b[3]""b[2]""b[1] >= c[3]""c[2]""c[1]) delete a[$1]}
     END     {for(k in a) print k,a[k]}' file1 file2

six 01/01/2017
four 01/02/2017
five 03/02/2017
one 01/02/2017

and operate on the result for copying files...

Explanation Given file 1 we want to remove the entries where date field is less than the matching entry in file 2.

NR==FNR {a[$1]=$2; next} cache the contents of file 1

$1 in a (now scanning second file) if a records exists in file 1

split($2,b,"/")... split date fields so that we can change the order to year-month-date for natural order comparison

if(b[3]...) delete a[$1] if the file 2 date is greater or equal to the one in file 1, delete the entry

END... print remaining entries, which will satisfy the requirement.

Upvotes: 1

mcoolive
mcoolive

Reputation: 4205

Parse 2 files simultaneously with awk is hard. So I suggest another algorithm: - merge the file - filter to keep the relevant lines

I may suggest to have a look on "comm" and "join" commands. Here an example

comm -23 <(sort file1) <(sort file2)

Upvotes: 0

Related Questions