2016-01-28 3 views
0

В чем разница между:Различия между Unix команд для сортировки CSV

!tail -n +2 hits.csv | sort -k 1n -o output.csv 

и

!tail -n +2 hits.csv | sort -t "," -k1 -n -k2 > output.csv 

? Я пытаюсь сначала отсортировать файл csv по первому столбцу, а затем по второму столбцу, чтобы строки с тем же первым столбцом все еще были вместе.

Кажется, что первый из них уже делает это правильно, сначала сортируя поле перед первой запятой, а затем полем, следующим за первой запятой. (разрыв связей, то есть.)

Или это на самом деле не так?

И что делает вторая команда? (И в чем разница между ними?). Когда я запускаю два, существует значительная разница между двумя файлами output.csv.

И, наконец, какой из них я должен использовать? (Или они оба ошибаются?)

ответ

1

Se е также ответ на @morido для некоторых других указателей, но вот описание того, что именно делают эти двух sort вызовов:

sort -k 1n -o output.csv 

Это предполагает, что «поле» в файле разделяется переходом от не- пробелы в пробелы (т.е. ведущие пробелы включаются в каждое поле, а не разделяются, как многие могут ожидать/предполагают), и сообщает sort заказывать вещи ключом, который начинается с первого поля и продолжается до конца строки, и предполагает, что ключ отформатирован как числовое значение. Вывод отправляется явно в конкретный файл.

sort -t "," -k1 -n -k2 

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

Поскольку вы не предоставили образцы данных, неизвестно, данные в первых двух областях, является ли числовая или нет, но я подозреваю, что вы хотите что-то вроде того, что было предложено в ответ на @morido:

sort -t, -k1,1 -k2,2 

или

sort -t, -k1,1n -k2,2n   (alternatively sort -t, -n -k1,1 -k2,2) 

если данные цифровые.

+0

Это мой hits.csv: –

+0

внутрибрюшинно, метка времени 62.172.72.131,1041502001 62.172.72.131,1041502098 62.121.107.115,1041809792 163.28.16.1,1043258352 216.37.59.126,1044304131 68.104.188.224,1044472900 66.137.118.69,1044543502 207.181.42.20,1044646708 205.156.184.254,1045670100 80.225.248.61,1045779615 200.44.24.157,1046214366 193.63.247.68,1046260886 66.176.248.72,1046317786 216.249.85.109,1046566502 68,44 .222.12,1046638290 130.113 .69.66,1048009156 –

+0

Итак, каков был бы правильный способ сделать это? –

1

Прежде всего: вы хотите удалить ведущие ! из этих двух команд. В Bash (и, возможно, другие, поскольку это происходит из csh), вы ссылаетесь на последнюю команду, содержащую tail в вашей истории, что здесь не имеет смысла.


Основное различие между двумя версиями заключается в том, что в первом случае вы не учитываете вторую колонку.

Это, как я хотел бы сделать это:

tail -n +2 hits.csv | sort -t "," -n --key=1,1 --key=2,2 > output.csv 
  • -t определяет разделитель полей
  • -n поворачивает на заказ числовой сортировки
  • --key определяет поля, которые должны быть использованы для сортировки (в порядок приоритета)
+0

Спасибо. @morrido –

Смежные вопросы