bash: замена совпадающих чисел с именами пользователей, содержащимися во втором файле

bash: замена совпадающих чисел с именами пользователей, содержащимися во втором файле

Я хочу заменить последнюю цифру каждой строки в «файле 1» на соответствующее имя пользователя из «файла 2», чтобы получить опубликованный результат.

файл 1:

28/02/13 46.149002259
22/03/13 68.234001404
14/03/16 69.83500766
29/01/14 87.083008540
14/03/16 106.516006874
14/03/16 201.552002260
03/12/12 207.521011278
18/08/16 234.7780151002

файл 2:

пользователь5874
пользователь2404
пользователь81002
пользователь4540
пользователь1259
пользователь6260
пользователь7278
пользователь366

это только часть «файла 2». на самом деле файл содержит гораздо больше пользователей.

результат:

28/02/13 46.149002 пользователь1
22/03/13 68.234001 пользователь2
14/03/16 69.835007 пользователь3
29/01/14 87.083008 пользователь4
14/03/16 106.516006 пользователь5
14/03/16 201.552002 пользователь6 03/12/12 207.521011
пользователь7
18/08/16 234.778015 пользователь8

решение1

Я предполагаю, что ваши файлы имеют строгий формат, в котором пробелы разделяют только столбцы (нет пробелов внутри любого имени пользователя и т. д.). Тогда это должно работать (по крайней мере на Linux, мой тестовый стенд — Kubuntu):

while read date value number ; do printf "%s %s %s\n" "$date" "$value" "$(grep " $number" file2 | head -n 1 | cut -f 1 -d " ")" ; done <file1

Некоторые пояснения:

  1. Команда читает из file1( … <file1).
  2. Пока он может прочитать строку ( while read …) …
  3. … он печатает его ( printf …), заменив третье поле на …
  4. … эффект $( … )
    1. … поиск строки, содержащей указанное число внутри file2( grep …, обратите внимание на начальный пробел: " $number") …
    2. … где берется только первое совпадение ( head …на всякий случай), …
    3. … и тогда остается только первый столбец ( cut …).

Связанный контент