Вопрос

У меня есть текстовый файл с такой компоновкой:

родовое слово

Я хотел бы поменять местами ключи (число) и значения (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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top