Extract lines from a file

Hi all;

Here is my file which contains a list of files (recent versions of files are in red). This file is dynamic, files versions can change at any time (versions can increment)

 filename
  -------------------------------------------------------
  /tmp/g-72.n.gggg1000.fr-worker1.V.3.tar.bz2
  /tmp/g-9.n.gggg1000.fr-worker1.V.2.tar.bz2
  /tmp/g-85.n.gggg1000.fr-worker1.V.3.tar.bz2
  /tmp/g-72.n.gggg1000.fr-worker1.V.2.tar.bz2
  /tmp/g-92.n.gggg1000.fr-worker1.V.4.tar.bz2
  /tmp/g-85.n.gggg1000.fr-worker1.V.2.tar.bz2
  /tmp/g-72.n.gggg1000.fr-worker1.V.1.tar.bz2
  /tmp/g-72.n.gggg1000.fr-worker1.V.4.tar.bz2
  /tmp/g-92.n.gggg1000.fr-worker1.V.2.tar.bz2
  /tmp/g-9.n.gggg1000.fr-worker1.V.3.tar.bz2
  /tmp/g-92.n.gggg1000.fr-worker1.V.1.tar.bz2
  /tmp/g-9.n.gggg1000.fr-worker1.V.1.tar.bz2
  /tmp/g-85.n.gggg1000.fr-worker1.V.1.tar.bz2
  /tmp/g-92.n.gggg1000.fr-worker1.V.3.tar.bz2
  /tmp/g-85.n.gggg1000.fr-worker1.V.4.tar.bz2
  

Please, can you help me to write a shell script that extract all old versions (i.e: lines in black) ?

Thank you so much for help.
Kind regards.

{ read A; read B; printf "%s\n" $A $B; sort -r; } < file | awk -F\. '!T[$1,$2,$3]++'
filename
-------------------------------------------------------
  /tmp/g-9.n.gggg1000.fr-worker1.V.3.tar.bz2
  /tmp/g-92.n.gggg1000.fr-worker1.V.4.tar.bz2
  /tmp/g-85.n.gggg1000.fr-worker1.V.4.tar.bz2
  /tmp/g-72.n.gggg1000.fr-worker1.V.4.tar.bz2
1 Like

Thank you so much for answer.
Please, i have to extract old versions (lines in blacks) not recent ones (lines in red).

Thanks a lot.
Kind regards.

Then, invert the logics!

1 Like

Ok. I have used 'sort' instead of 'sort -r'

{ read A; read B; printf "%s\n" $A $B; sort; } < file | awk -F\. '!T[$1,$2,$3]++'

I have only !

filename
-------------------------------------------------------
/tmp/g-72.n.gggg1000.fr-worker1.V.1.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker1.V.1.tar.bz2
/tmp/g-92.n.gggg1000.fr-worker1.V.1.tar.bz2
/tmp/g-9.n.gggg1000.fr-worker1.V.1.tar.bz2

Any help please ?
Bests.

In post#2, remove the exclamation mark in front of the T array.

1 Like

I have this output:

/tmp/g-9.n.gggg1000.fr-worker1.V.2.tar.bz2
/tmp/g-9.n.gggg1000.fr-worker1.V.1.tar.bz2
/tmp/g-92.n.gggg1000.fr-worker1.V.3.tar.bz2
/tmp/g-92.n.gggg1000.fr-worker1.V.2.tar.bz2
/tmp/g-92.n.gggg1000.fr-worker1.V.1.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker1.V.3.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker1.V.2.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker1.V.1.tar.bz2
/tmp/g-72.n.gggg1000.fr-worker1.V.3.tar.bz2
/tmp/g-72.n.gggg1000.fr-worker1.V.2.tar.bz2
/tmp/g-72.n.gggg1000.fr-worker1.V.1.tar.bz2

That's what i need. Thank you so much for help. Kind regards.

To retain the header, use

{ read A; read B; printf "%s\n" $A $B; sort -r | awk -F\. 'T[$1,$2,$3]++'; } <file
filename
-------------------------------------------------------
.
.
.

Hi,
Please, with this code:

#! /bin/sh
{ read A; read B; printf "%s\n" $A $B; sort -r ; } < Versions.txt | awk -F\. 'T[$1,$2,$3]++'

and this file:

filename
-------------------------------------------------------
/tmp/g-85.n.gggg1000.fr-worker3.V.1.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker2.V.2.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker3.V.2.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker1.V.1.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker2.V.3.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker2.V.1.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker1.V.3.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker1.V.2.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker3.V.3.tar.bz2

I have this output

/tmp/g-85.n.gggg1000.fr-worker3.V.2.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker3.V.1.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker2.V.3.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker2.V.2.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker2.V.1.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker1.V.3.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker1.V.2.tar.bz2
/tmp/g-85.n.gggg1000.fr-worker1.V.1.tar.bz2

Please, how can i change the script to delete also the red lines ?

Thanks a lot for help.
Best reagards.

---------- Post updated at 02:54 PM ---------- Previous update was at 12:59 PM ----------

it works fine with:

#! /bin/sh
{ read A; read B; printf "%s\n" $A $B; sort -r ; } < Versions.txt | awk -F\. 'T[$1,$2,$3,$4]++'