Список, отсортированный по 1-му полю, как я могу соединить 2-е поле в строках, где 1-е поле совпадает?

Короткий поиск в Google дал несколько решений FUSE:

  • cmdfs , достаточно мощная, помимо фильтрации может выполнять преобразование или даже создание файлов на лету,
  • ROFS -Отфильтровано , создать каталог только для чтения -с файлами, соответствующими заданному шаблону, и
  • Различные другие решения, которые играют со списком каталогов, перечисленных в libfuse Wiki по адресуhttps://github.com/libfuse/libfuse/wiki/Filesystems.

1
13.12.2019, 11:47
2 ответа

С sort+ awkтрубопроводом:

sort -k1,1 file \
| awk 'url && $1 != url{ print url, acc }
      { acc = ($1 == url? acc FS:"") $2; url = $1 }END{ print url, acc }' OFS='\t'

Пример вывода:

url1    acct2
url2    acct1
url3    acct1 acct2
url4    acct2 acct3 acct5
3
27.01.2020, 23:17

Использование GNUdatamash:

$ datamash -W -g 1 collapse 2 < input.txt
url1    acct2
url2    acct1
url3    acct1,acct2
url4    acct2,acct3,acct5

Опции:

  • -Wиспользуйте пробелы/табуляции в качестве разделителя полей
  • -g 1группа на первом поле
  • collapse 2разделенный запятой -список значений второго поля

Вы можете преобразовать запятые в пробелы с помощьюtr:

$ datamash -W -g 1 collapse 2 < input.txt | tr ',' ' '
url1    acct2
url2    acct1
url3    acct1 acct2
url4    acct2 acct3 acct5

Если вам нужно отсортировать вывод по первому полю, добавьте-s:

datamash -s -W -g 1 collapse 2 < input.txt | tr ',' ' '
1
27.01.2020, 23:17

Теги

Похожие вопросы