Вернуть последнюю строку нескольких совпадающих записей — Git Bash

у меня два файла.....

Один файл содержит записи:

123
456
789
abc
def
ghi

Второй файл содержит записи:

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

Попытка выполнить команду grep и tail, которая вернет последнюю строку совпадающей строки в файле 2, чтобы выходной файл вернул следующее:

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

Пытался использовать следующее, но он просто возвращает последнюю строку последней соответствующей записи:

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

person LedHead    schedule 05.07.2017    source источник


Ответы (1)


Используйте решение awk:

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

Выход:

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

  • FS=',' - разделитель полей

  • b[$1]=$2 - в конечном итоге содержит последнее значение второго поля для тех же значений первого поля

person RomanPerekhrest    schedule 05.07.2017
comment
Гольф: awk -F, 'NR==FNR{ a[$1]=1; next }a[$1]{ b[$1]=$2 }END{ for(i in b) print i FS b[i] }' - person George Vasiliou; 06.07.2017
comment
@GeorgeVasiliou, я бы сказал, что это было немного короче, но не быстрее - person RomanPerekhrest; 06.07.2017