сортировать CSV-файл с помощью утилиты Unix - PullRequest
0 голосов
/ 07 июня 2011

существует ли способ сортировки очень большого файла CSV с использованием sort?
Просто выполните сортировку по первому столбцу, однако данные могут содержать разрывы строк в столбце (применяются стандартные правила файла CSV).Будет ли разрыв строки ломать утилиту sort?

Ответы [ 4 ]

0 голосов
/ 05 мая 2013

Более простой подход состоит в том, чтобы временно изменить ваши данные, чтобы стандартная команда сортировки UNIX могла правильно интерпретировать ваши данные.

Вы можете использовать программу с именем csvquote, которая заменяет проблемные запятые и символы новой строки внутри значений полей в кавычках нанепечатные символы.Затем он восстанавливает эти символы в конце вашего конвейера.

Например,

csvquote inputfile.csv | sort | csvquote -u

Вы можете найти код здесь: https://github.com/dbro/csvquote

0 голосов
/ 07 июня 2011

Функция сортировки сортирует строки в асикографическом порядке.Чтобы получить более сложный эффект, вы можете использовать утилиту UNIX awk.

0 голосов
/ 07 июня 2011

Вы можете сделать это с помощью набора утилит. Надеюсь, я правильно понял ... и если это так, то это может сработать. Если нет, укажите, где я ошибся в предположении :-) Для этого необходимо, чтобы число полей на запись CSV было фиксированным (это также очень простой пример, который не охватывает различные варианты CSV (например, привет, " Мир, как ", вы бы разбить как" мир, как "будет разделен на два поля)):

hello,world,how,are,you
one,two,three,four,five
once,I,caught,a
fish,alive
hey,now,hey,now,now

И этот скрипт awk:

BEGIN {
        FS=","
        fields=0
}

{
        if (line == "") {
                fields=NF
                line = $0
        } else {
                fields=fields + (NF - 1)
                line=line"|"$0
        }
}

fields == 5 {
        print line
        fields = 0
        line = ""
}

Выполнение этого:

awk -f join.awk < infile | sort | tr '|' '\n'

дает этот вывод:

hello,world,how,are,you
hey,now,hey,now,now
once,I,caught,a
fish,alive
one,two,three,four,five

По сути, все, что мы делаем со сценарием awk, это объединение многострочных записей в одну строку, которую мы затем можем передать в sort, а затем снова разбить с помощью tr. Я использую канал в качестве замены символа новой строки - просто выберите то, что вы можете гарантировать, не будет отображаться в записи CSV.

Теперь это может быть не идеально для того, что вы хотите, но, надеюсь, это подтолкнет вас в правильном направлении. Главное, что я написал в скрипте awk, - это то, что ему нужно знать, сколько полей в записи CSV. Это должно быть исправлено. Если это переменная, то все ставки отключены, так как там должно быть больше правил, которые определяют семантическую природу файла, который вы хотите отсортировать ...

0 голосов
/ 07 июня 2011

Полагаю, вам следует попробовать что-то вроде этого cat old.csv | sort > new.csv

UPD: для подготовки данных, если необходимо, мы можем использовать скрипт AWK ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...