Я стикаюся з величезним файлом у 4 стовпці. Я хотів би відобразити відсортований файл у stdout на основі його 3-го стовпця:
cat myFile | sort -u -k3
Чи достатньо цього для виконання трюку?
sort -u -k3 myFile
, навіть
Я стикаюся з величезним файлом у 4 стовпці. Я хотів би відобразити відсортований файл у stdout на основі його 3-го стовпця:
cat myFile | sort -u -k3
Чи достатньо цього для виконання трюку?
sort -u -k3 myFile
, навіть
Відповіді:
sort -k 3,3 myFile
буде відображати файл, відсортований за третім стовпцем, припускаючи, що стовпці розділені послідовностями пробілів (символи ASCII SPC та TAB в мові POSIX / C), відповідно до порядку сортування, визначеного поточним локальним словом.
Зауважте, що провідні пробіли включені у стовпчик (роздільник за замовчуванням - це перехід від непорожнього до порожнього), що може змінити місцевості, де пробіли не ігноруються з метою порівняння, використовуйте -b
опцію для ігнорування провідні заготовки.
Зауважте, що вона абсолютно незалежна від оболонки (всі оболонки розбирали б цей командний рядок однаково; оболонки зазвичай не мають sort
вбудованої команди).
-k 3
- сортувати на ділянці рядків, починаючи з 3- го стовпця (включаючи провідні пробіли). У мові C, оскільки символи пробілу та вкладки стоять перед усіма символами для друку, це, як правило, дає такий же результат, як -k 3,3
(за винятком рядків, що мають ідентичне третє поле),
-u
полягає в тому, щоб зберегти лише один з рядків, якщо є кілька таких, що сортують однаково (саме там ключ сортування впорядковується однаково (це не обов'язково те саме, що рівне )).
cat
це команда con cat enate. Тут вам це не потрібно.
Якщо стовпці розділені чимось іншим, вам потрібна -t
опція, щоб вказати роздільник.
Наведено приклад файлу a
$ cat a
a c c c
a b ca d
a b c e
a b c d
З -u -k 3
:
$ echo $LANG
en_GB.UTF-8
$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b c e
У рядках 2 і 3 є той самий третій стовпчик, але тут ключ сортування знаходиться від третього стовпця до кінця рядка, тому -u
зберігає обидва. ␠ca␠d
сортування раніше, ␠c␠c
тому що пробіли ігноруються під час першого проходу в моїй місцевості, cad
сортування раніше cc
.
$ sort -u -k 3,3 a
a b c d
a b c e
a b ca d
Зверху зберігається лише одна для тих, де знаходиться 3-й стовпець ␠c
. Зверніть увагу, як ␠␠c
зберігається одна з (2 провідні пробіли).
$ sort -k 3 a
a b ca d
a c c c
a b c d
a b c e
$ sort -k 3,3 a
a b c d
a c c c
a b c e
a b ca d
Подивіться, як змінюється порядок a b c d
і a c c c
змінюються. У першому випадку, тому що ␠c␠c
сортування раніше ␠c␠d
, у другому випадку тому, що ключ сортування такий самий ( ␠c
), порівняння останньої інстанції, яке порівнює рядки в повному обсязі, ставить a b c d
раніше a c c c
.
$ sort -b -k 3,3 a
a b c d
a b c e
a c c c
a b ca d
Після того, як ми ігноруємо пробіли, ключ сортування для перших 3 рядків є однаковим ( c
), тож вони сортуються за порівнянням останньої інстанції.
$ LC_ALL=C sort -k 3 a
a b c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b c e
a b c d
a c c c
a b ca d
У локалі C сортуйте ␠␠c
раніше, ␠c
оскільки там є лише один прохід, де символи (тоді одиничні байти) сортують виходячи зі значення кодової точки (де простір має нижчу кодову точку, ніж c
).
blank
розділені, які можуть містити інші символи на додаток до пробілу та вкладки залежно від мови.
3,3
робить? Чому б не просто 3
?
Якщо ви розумієте "стовпець", як у текстовому файлі (4-й символ), то так, ваше рішення повинно працювати (або навіть sort -u -k3 myFile
дозволяти sort
виконувати деякі магії, що зберігають пам'ять із випадковим доступом). Якщо ви розумієте "стовпчик", як у базі даних - ціла сукупність даних, що супроводжується роздільником та змінною шириною стовпця, вам знадобиться щось більш фантазійне, наприклад, це сортує ls -l за розміром
ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
(що еквівалентно тривіальному, ls -lS
але добре слугує прикладу.)
sort -k 1.3,1.3
. ls -l | sort -k5,5n
сортувати за розміром.
awk
Рішення саме те , що я needed-- легко змінений , щоб відповідати вимогам комплексу сортування
sort -g -k column_number
є правильною командою для сортування будь-якого списку, що містить числові символи, використовуючи певний стовпець
Ви можете використовувати бібліотеку awk Velour :
#!/usr/local/bin/velour -f
{
q[NR] = $3
z[NR] = $0
}
END {
a_sort_by(q, z)
io_puts(q)
}
$ sort -k 1.3,1.3 myfile
Сортуйте ваш файл myfile у третьому стовпці, якщо у вашому файлі немає роздільника.
$ cat myfile
ax5aa
aa3ya
fg7ds
pp0dd
aa1bb
$ sort -k 1.3,1.3 myfile
pp0dd
aa1bb
aa3ya
ax5aa
fg7ds
man сторінка роду:
[...] -k, --key = POS1 [, POS2] запустіть ключ у POS1 (початок 1), закінчіть його на POS2 (кінець рядка за замовчуванням) [...] POS - F [.C] [ OPTS], де F - номер поля, а C - символ символів у полі; обидва мають походження 1. Якщо ні -t, ні -b не діє, символи в полі рахуються з початку попереднього пробілу. OPTS - це один або кілька варіантів впорядкування з однієї літери, які змінюють глобальні параметри замовлення для цього ключа. Якщо ключ не вказаний, використовуйте весь рядок як ключ.
За допомогою --key = 1.3,1.3, ви сказали, що існує лише одне поле (весь рядок) і ви порівнюєте положення третього символу цього поля.
sort -u -k3 < myFile
.