datamash -t: -s groupby 1 collapse 2 < file
Если ваши данные уже отсортированы, вы можете опустить -s
.
Или использование анонимного массива внутри хеша в Perl:
$ perl -F: -lne '
push @{ $h{$F[0]} }, $F[1]
}{
for $k (sort keys %h) {print "$k:", join ",", @{ $h{$k}} }
' file
1.1.1.1:21,22
2.2.2.2:443
3.3.3.3:80,443
bluetoothctl
сохраняет историю команд в ~/.cache/.bluetoothctl_history
.
Отказ от ответственности :длинный ответ требует некоторого понимания языка программирования C.
bluetoothctl
— это инструмент командной строки, который поставляется с BlueZ — стеком протоколов Bluetooth для Linux . Если мы посмотрим на исходный код BlueZ:
мы быстро поймем, что bluetoothctl
использует библиотеку GNU Readline для своей интерактивной оболочки. Согласно документации Readline , функция write_history
может использоваться для записи истории в файл. Если мы просто найдем имя этой функции в исходном коде BlueZ:
$ grep write_history -r
src/shared/shell.c: write_history(data.history);
История команд в bluetoothctl
записывается в файл, имя которого хранится в поле .history
в struct data
. Затем, просто выискивая обращения к этому полю, мы найдем, где оно инициализировано:
static void rl_init_history(void)
{
const char *name;
char *dir;
memset(data.history, 0, sizeof(data.history));
name = strrchr(data.name, '/');
if (!name)
name = data.name;
else
name++;
dir = getenv("XDG_CACHE_HOME");
if (dir) {
snprintf(data.history, sizeof(data.history), "%s/.%s_history",
dir, name);
goto done;
}
dir = getenv("HOME");
if (dir) {
snprintf(data.history, sizeof(data.history),
"%s/.cache/.%s_history", dir, name);
goto done;
}
dir = getenv("PWD");
if (dir) {
snprintf(data.history, sizeof(data.history), "%s/.%s_history",
dir, name);
goto done;
}
return;
done:
read_history(data.history);
using_history();
bt_shell_set_env("HISTORY", data.history);
}
Здесь XDG_CACHE_HOME
взято из спецификации freedesktop.org . Другие переменные окружения — основные $HOME
и $PWD
. Поле data.name
настроено в другом месте:
void bt_shell_init(int argc, char **argv, const struct bt_shell_opt *opt)
{
...
data.name = strrchr(argv[0], '/');
...
}
Таким образом, переменная char *name
в функции rl_init_history
будет содержать строку bluetoothctl
, имя исполняемого файла. См. описание argv
в C .
Таким образом, в большинстве сред рабочего стола, соответствующих спецификации freedesktop.org, инструмент командной строки bluetoothctl
будет хранить историю команд в файле ~/.cache/.bluetoothctl_history
. Если переменная среды XDG_CACHE_HOME
определена,тогда история команд будет храниться в $XDG_CACHE_HOME/.bluetoothctl_history
.