web-dev-qa-db-fra.com

Comment puis-je obtenir la dernière occurrence d'une chaîne répétée dans le fichier texte?

J'ai un fichier de données composé de plusieurs lignes et colonnes avec des données numériques et chaîne. Certains modèles de chaîne et numériques sont répétés. J'ai besoin d'extraire le dernier motif répété. Par exemple;

715 ANKR PRN 1 value 1
760 ISTA PRN 2 value 2
715 ANKR PRN 1 value 3
760 ISTA PRN 2 value 4
715 ANKR PRN 1 value 5
760 ISTA PRN 2 value 6
  1 ANKR PRN 7 value 8
  2 ISTA PRN 7 value 9
  1 ANKR PRN 7 value 10
  3 ISTA PRN 7 value 11
  1 ANKR PRN 7 value 12

dans cet exemple, "715 ANKR PRN 1", "760 ISTA PRN 2" et "1 ANKR PRN 7" sont répétés 3 fois dans le fichier de données. Je dois extraire les derniers motifs répétés et trier comme suit;

715 ANKR PRN 1 value 5
760 ISTA PRN 2 value 6
  1 ANKR PRN 7 value 12
1
deepblue_86

Avec les outils standard, sort, rev, uniq:

% sort -k1,5 -k6,6nr file.txt | rev | uniq -f1 -d | rev

  1 ANKR PRN 7 value 12
715 ANKR PRN 1 value 5
760 ISTA PRN 2 value 6

Si vous souhaitez trier la sortie comme vous le souhaitez:

% sort -k1,5 -k6,6nr file.txt | rev | uniq -f1 -d | rev | sort -k6,6n

715 ANKR PRN 1 value 5
760 ISTA PRN 2 value 6
  1 ANKR PRN 7 value 12
3
heemayl

Que diriez-vous

awk '{a[$1 FS $2 FS $3 FS $4 FS $5] = $6; c[$1 FS $2 FS $3 FS $4 FS $5]++}; END{for (i in a) {if (c[i]>1) print i,a[i]}}'

Tester avec votre entrée

$ awk '{a[$1 FS $2 FS $3 FS $4 FS $5] = $6; c[$1 FS $2 FS $3 FS $4 FS $5]++}; END{for (i in a) {if (c[i]>1) print i,a[i]}}' file
715 ANKR PRN 1 value 5
760 ISTA PRN 2 value 6
1 ANKR PRN 7 value 12
1
steeldriver