Я хочу заменить последнюю цифру каждой строки в «файле 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
Некоторые пояснения:
- Команда читает из
file1
(… <file1
). - Пока он может прочитать строку (
while read …
) … - … он печатает его (
printf …
), заменив третье поле на … - … эффект
$( … )
…- … поиск строки, содержащей указанное число внутри
file2
(grep …
, обратите внимание на начальный пробел:" $number"
) … - … где берется только первое совпадение (
head …
на всякий случай), … - … и тогда остается только первый столбец (
cut …
).
- … поиск строки, содержащей указанное число внутри