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

файл 1:

28.02.13 46.149002 259
22.03.13 68.234001 404
14.03.16 69.835007 66
29.01.14 87.083008 540
14/03/16 106,516006 874
14/03/16 201,552002 260
12.03.12 207.521011 278
18.08.16 234.778015 1002

файл 2:

user5 874
user2 404
user8 1002
user4 540
user1 259
user6 260
user7 278
user3 66

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

результат:

28.02.13 46.149002 user1
22/03/13 68.234001 user2
14.03.16 69.835007 user3
29.01.14 87.083008 user4
14/03/16 106,516006 user5
14/03/16 201,552002 user6
12.03.12 207.521011 user7
18/08/16 234,778015 user8

1 ответ1

2

Я предполагаю, что ваши файлы имеют этот строгий формат, где пробелы только в отдельных столбцах (внутри любого имени пользователя и т.д. Нет места). Тогда это должно работать (по крайней мере в 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 …).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .