2

Я пытаюсь sort csv на своем компьютере, но, похоже, стираю содержимое каждый раз, когда использую команду sort . Я в основном создал копию моего CSV без первого ряда:

sed '1d' original.csv > newcopy.csv

Чтобы подтвердить, что в моей новой копии отсутствует первая строка, я могу проверить с помощью head:

head 1 newcopy.csv

Конечно же, он находит мой файл и показывает мне оригинал второй (теперь первый ряд). Мой CSV состоит из множества значений, разделенных запятыми:

Jonathan Sampson,,,,foo@bar.com,,,GA,United States,,
Jane Doe,Mrs,,,bar@foo.com,,,FL,United States,32501,

Как указано выше, некоторые поля пусты. Я хочу выполнить сортировку по полю адреса электронной почты, которое равно 4 или 5 - в зависимости от того, использует ли команда sort индекс с нуля. Поэтому я пробую следующее:

sort -t, +4 -5 newcopy.csv > newcopy.csv

Поэтому я использую -t, чтобы указать, что мои поля заканчиваются запятой, а не пробелом. Я не уверен, что +4 -5 самом деле сортирует в поле электронной почты или нет - я мог бы использовать некоторую помощь здесь. А затем newcopy.csv > newcopy.csv перезаписать исходный файл новыми результатами сортировки.

После того, как я это сделаю, если я попытаюсь прочитать в первой строке:

head 1 newcopy.csv

Я получаю следующую ошибку:

head: не может открыть `1 'для чтения: нет такого файла или каталога ==> newcopy.csv <==

Конечно же, если я проверю свой каталог, файл теперь пуст, и 0 байтов.

2 ответа2

3

Перенаправление усекает выходной файл до его чтения на стороне ввода. Вам нужно будет использовать временный файл.

Редактировать:

Вот пример:

sort -t, -k 5,5 newcopy.csv > tmp.csv && mv tmp.csv newcopy.csv

Поля сортировки основаны на одном. Эта команда говорит, что сортировать нужно только по пятому полю, выводить во временный файл и перемещать временный файл обратно к исходному имени, если сортировка завершилась без ошибок.

1

Обратите внимание, что sort имеет параметр -o который записывает результаты в файл вместо стандартного вывода, поэтому вы должны сделать:

sort -t, +4 -5 -o newcopy.csv newcopy.csv

поскольку при использовании оператора перенаправления (такого как > или >>) оболочка создает / усекает файл до того, как команда даже будет вызвана.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .