![bash: замена совпадающих чисел с именами пользователей, содержащимися во втором файле](https://rvso.com/image/1539555/bash%3A%20%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B2%D0%BF%D0%B0%D0%B4%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D1%87%D0%B8%D1%81%D0%B5%D0%BB%20%D1%81%20%D0%B8%D0%BC%D0%B5%D0%BD%D0%B0%D0%BC%D0%B8%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9%2C%20%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D1%89%D0%B8%D0%BC%D0%B8%D1%81%D1%8F%20%D0%B2%D0%BE%20%D0%B2%D1%82%D0%BE%D1%80%D0%BE%D0%BC%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B5%20.png)
Я хочу заменить последнюю цифру каждой строки в «файле 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 …
).
- … поиск строки, содержащей указанное число внутри