Вы можете объединить все необходимые UUID в одном выражении:
select w1.uid, array_agg(w2.uid order by wl.idx) as uuidlist
from words w1
cross join lateral unnest(w1.wordlist) with ordinality as wl(word,idx)
join words w2 on w2.word = wl.word
where w1.wordlist is not null
and w1.uuidlist is null -- optional
group by w1.uid;
Опция with ordinality
возвращает дополнительный столбец, который указывает положение элемента в исходном массиве. Это необходимо для агрегирования UUID в правильном порядке.
Это возвращает следующий результат с вашими примерами данных:
uid | uuidlist
-----+------------
cccc | {aaaa,bbbb}
Это может использоваться в качестве источника оператора обновления (при условии, что столбец uid
уникален):
update words
set uuidlist = t.uuidlist
from (
select w1.uid, array_agg(w2.uid order by wl.idx) as uuidlist
from words w1
cross join lateral unnest(w1.wordlist) with ordinality as wl(word,idx)
join words w2 on w2.word = wl.word
where w1.wordlist is not null
and w1.uuidlist is null -- optional
group by w1.uid
) t
where t.uid = words.uid;
Пример в сети: https://rextester.com/LZUYC57184
(обратите внимание, что отображение массивов в этом примере немного странно) sup> [ 1111]
Я сталкивался с этой проблемой несколько раз. Изменение точек на вкладки выстроит их в ряд в основном хорошо, но не совсем. Это правда, что все столбцы будут начинаться с табуляции, но нет никакой гарантии, что они будут на одной табуляции. Например, если это был ваш оригинальный текст:
lt1tab.value1
gt1tabstop.value2
, а вы делаете:
%s/\./\t/g
и предполагая, что табуляция состоит из 8 пробелов, вы получите:
lt1tab value1
gt1tabstop value2
Вместо этого вы можете удалить все, кроме последнего столбца (или любого столбца, который вы хотите). Например:
%s/^.*\.//
оставит вам:
value1
value2
, который вы можете легко скопировать и вставить.
Если вам не нужно использовать Vim, вы можете использовать unix cut
, чтобы делать то, что вы want:
cut -f2 -d. input_file > output_file
Почему бы не заблокировать визуальный режим? Cv, выберите то, что вы хотите, и вставьте его в другое приложение. Для такого типа вставки вы, вероятно, также должны установить
:set guioptions+=a
.
Хмм, теперь, когда я перечитал ваш вопрос. Вы спрашиваете, как разделить данные на столбцы или как вставить их в какое-то другое приложение?
Я думаю, что получил это сейчас (3-е чтение).
Делайте, как вы сделали, и получите пробелы, где точки раньше были. Затем сделайте другую замену и замените пробелы вкладками, каждая из которых должна быть 15 или что-то в этом роде. Это выстроит их красиво. Затем вы можете выбрать и скопировать их куда угодно.
Вы также можете сопоставить регулярное выражение, например, чтобы выбрать второй столбец, но, хотя он светится как рождественская елка, вы не сможете его выдернуть.
Очевидно, что описанные выше методы с выбором блока и / или Excel проще. Но я мазохист, и я решил, что у вас нет доступа ни к одному из них, и постараюсь сделать это только с помощью команд vi. Вот ужасная вещь, которую я придумал:
Мой основной план - превратить список соединенных столбцов в два списка, один за другим. Это в основном включает разбиение каждой строки на две строки, а затем копирование каждой второй строки в конец файла.
Итак, сначала мы должны разбить каждую строку на две строки с помощью этой команды:
:%s/\./^M/
Далее, качаемся внизу файла и создаем пустую строку, затем возвращаемся к первой строке. Это поможет с удобочитаемостью позже.
Go[Esc]
:1
Теперь вам нужно сопоставить следующую последовательность с вашим любимым ключом:
:map [Key] mkjddGp'kj
(Для записи это помечает текущую строку, удаляет строку под ней, вставляет эту строку внизу файла, возвращает к строке, с которой вы начали, и затем переходит к следующей строке.)
Наконец, нажмите назначенную клавишу один раз для каждой строки в вашем списке. Итак, со списком примеров, вы бы нажали его 5 раз. Убедитесь, что вы начинаете с первой строки в списке !!
В конце у вас будет следующее:
current_well
current_well
current_well
well_location
well_location
well_number
well_name
well_type_code
section
range
Теперь вы можете легко скопировать каждый список туда, куда вам нужно его поместить.
Я бы конвертировал точки во вкладки, а затем блокировал выделение каждого столбца:
:% s /\./ CtrlV-Tab / g
CtrlV , чтобы затем блокировать выделение столбцов.
Или, поскольку у вас будут значения, разделенные табуляцией, они будут вставлены непосредственно в столбцы в Excel.
Один из вариантов - использовать этот плагин Align для выравнивания периодов, чтобы вам было легче выбирать столбец в режиме визуального блока. Например, если вы сделаете это:
:%Align \.
Вы получите:
current_well . well_number
current_well . well_name
current_well . well_type_code
well_location . section
well_location . range
Если вы не хотите использовать плагин, попробуйте заполнить столбцы пробелами. например, для вашего текста:
:%s/\v(.*)\.(.*)/\=printf("%-16s %s", submatch(1), submatch(2))/
Это оставит вас с:
current_well well_number
current_well well_name
current_well well_type_code
well_location section
well_location range
Затем вы можете Ctrl-V
и выбрать столбец текста для копирования. Просто убедитесь, что вы выбрали ширину столбца шире, чем ваше самое широкое значение.
Время использования методов расширения:
Для примера второго пункта; у вас может быть метод расширения для IList
(например, Sort
), который может быть полностью записан с использованием существующих IList
членов .. так зачем кому-то еще что-то писать? Это основной блок LINQ, и он позволил Microsoft предоставить гораздо больше большей функциональности, ничего не нарушая. Вы не можете гарантировать, что ваш код будет версией, которая выполняется с помощью метода расширения,
Вы можете выбрать столбцы в gvim, набрав либо Ctrl-V Ctrl-G , либо Ctrl-Q Ctrl-G (в зависимости от того, используете ли вы окна, вставьте сопоставления клавиш), а затем выберите мышью.