Поменять местами ключ и пару значений массива
-
21-08-2019 - |
Вопрос
У меня есть текстовый файл с такой компоновкой:
родовое словоЯ хотел бы поменять местами ключи (число) и значения (CSV) (они разделены символом табуляции), чтобы получить следующее:
родовое слово(Обратите внимание, что 2 не дублируется для c.)
Мне не нужен этот точный вывод.Числа во входных данных упорядочены, а значения - нет.Ключи вывода должны быть упорядочены, как и значения.
Как я могу это сделать?У меня есть доступ к стандартным утилитам оболочки (awk, sed, grep ...) и GCC.При необходимости я, вероятно, смогу найти компилятор / интерпретатор для других языков.
Решение
Если у вас есть Python (если вы используете Linux, возможно, у вас уже есть), я бы использовал для этого короткий скрипт python.Обратите внимание, что мы используем наборы для фильтрации «двойных» элементов.
Отредактировано в соответствии с требованиями автора:
родовое словоДругие советы
Я бы попробовал Perl, если он вам доступен.Прокрутите ввод по очереди.Разделите строку на вкладке, а затем правую часть на запятые.Поместите значения в ассоциативный массив с буквами в качестве ключей и значением в другом ассоциативном массиве.Второй ассоциативный массив будет играть роль набора, чтобы исключить дубликаты.
После прочтения входного файла выполните сортировку по ключам ассоциативного массива, прокрутите и выдайте результаты.
вот небольшая утилита на php:
родовое словоне совсем оптимизирован и не выглядит красивым, но работает ...
Вот пример использования модуля CPAN Text :: CSV вместо ручного анализа полей CSV:
родовое слово Обратите внимание, что он будет выводиться на стандартный вывод.Я рекомендую просто перенаправить стандартный вывод, и если вы вообще расширите эту программу, убедитесь, что вы используете warn()
для вывода любых ошибок, а не просто генерируете их.Кроме того, он не будет проверять повторяющиеся записи, но я не хочу, чтобы мой код выглядел как код Брэда Гилберта, который выглядит немного странно даже для Perlite.
Вот ответы awk (1) и sort (1):
В основном ваши данные представляют собой набор данных "многие ко многим", поэтому первым шагом является нормализация данных с использованием одного ключа и значения для каждой строки.Мы также поменяем местами ключи и значения, чтобы указать новое первичное поле, но это не является строго необходимым, поскольку части, расположенные ниже, не зависят от порядка.Мы используем табуляцию или [пробелы], [пробелы] в качестве разделителя полей, поэтому мы разделяем табуляцию между ключом и значениями, а также между значениями.В результате в значениях останутся пробелы, но они будут обрезаны до и после:
родовое словоЗатем мы хотим применить ваш порядок сортировки и устранить дубликаты.Мы используем функцию bash, чтобы указать символ табуляции в качестве разделителя (-t $ '\ t').Если вы используете оболочку Bourne / POSIX, вам нужно будет использовать '[tab]', где [tab] - буквальная вкладка:
родовое словоЗатем верните его в желаемую форму:
родовое словоСоедините их вместе, и вы должны получить желаемый результат.Я тестировал инструменты GNU.