2017-07-05 1 views
0

J'ai deux fichiers .....dernière ligne de plusieurs enregistrements correspondants - Git Bash

Un fichier contient des enregistrements:

123 
456 
789 
abc 
def 
ghi 

Second fichier contient des enregistrements:

123,a 
123,b 
456,a 
456,b 
789,a 
789,b 
abc,1 
abc,2 
def,1 
def,2 
ghi,1 
ghi,2 

Essayer de faire une commande grep et tail qui renverrait la dernière ligne d'une chaîne correspondante dans le fichier 2 afin que le fichier de sortie renvoie les éléments suivants:

123,b 
456,b 
789,b 
abc,2 
def,2 
ghi,2 

a essayé d'utiliser ce qui suit, mais il renvoie simplement la dernière ligne du dernier enregistrement correspondant:

grep -f file1.txt file2.txt | tail -1 > output.txt 

Répondre

1

Utilisez awk solution:

awk 'NR==FNR{ a[$0]; next }$1 in a{ b[$1]=$2 }END{ for(i in b) print i FS b[i] }' file1 FS=',' file2 

La sortie:

def,2 
abc,2 
ghi,2 
123,b 
456,b 
789,b 

  • FS=',' - séparateur de champ

  • b[$1]=$2 - contient finalement la dernière valeur 2 sur le terrain pour même 1er des valeurs de champ

+0

Golf: 'awk -F, « NR == FNR {a [$ 1] = 1; next} a [$ 1] {b [$ 1] = $ 2} END {pour (i en b) imprimer i FS b [i]} '' –

+0

@GeorgeVasiliou, je dirais que c'était un peu plus court, mais pas plus rapide – RomanPerekhrest