Как отсортировать список файлов в стиле ls?

325
george

Как отсортировать по последнему столбцу список, который выглядит следующим образом:

drwxr-sr-x 2 user group 4096 2018-02-19 14:11:42 /something/project/somefile drwxr-sr-x 2 user group 4096 2018-02-19 00:14:50 /blah-blah/anything -rw-r----- 1 someone users 2188 2018-07-21 13:52:59 /aaa/222 drwxr-S--- 2 someone users 4096 2018-06-25 14:27:42 /bbb/333/anything/whatever -rw-r----- 1 someone users 715 2018-06-16 20:09:58 /xxx/aaa/666 

* Список находится в файле, но не сгенерирован, lsпоэтому я не могу использовать функциональность ls.

0

1 ответ на вопрос

2
Attie

Вы можете использовать sort:

sort -k8,8 <<EOF drwxr-sr-x 2 user group 4096 2018-02-19 14:11:42 /something/project/somefile drwxr-sr-x 2 user group 4096 2018-02-19 00:14:50 /blah-blah/anything -rw-r----- 1 someone users 2188 2018-07-21 13:52:59 /aaa/222 drwxr-S--- 2 someone users 4096 2018-06-25 14:27:42 /bbb/333/anything/whatever -rw-r----- 1 someone users 715 2018-06-16 20:09:58 /xxx/aaa/666 EOF 

-kвыбирает поле для сортировки, 8,8говорит сортировать данные из поля 8 в поле 8.

Вы можете использовать -tдля определения разделителя полей, хотя по умолчанию здесь хорошо (переход от непустого к пустому).

Выход:

-rw-r----- 1 someone users 2188 2018-07-21 13:52:59 /aaa/222 drwxr-S--- 2 someone users 4096 2018-06-25 14:27:42 /bbb/333/anything/whatever drwxr-sr-x 2 user group 4096 2018-02-19 00:14:50 /blah-blah/anything drwxr-sr-x 2 user group 4096 2018-02-19 14:11:42 /something/project/somefile -rw-r----- 1 someone users 715 2018-06-16 20:09:58 /xxx/aaa/666 

Для продолжения вы спросили:

Мой файл, содержащий список, также имеет N начальных и M конечных строк, которые не имеют форму столбца, показанную выше. К сожалению, сортировка портит их. Как я могу исключить эти строки и отсортировать только столбцы?

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

Содержание data.txt:

Zline1 Zline2 drwxr-sr-x 2 user group 4096 2018-02-19 14:11:42 /something/project/somefile drwxr-sr-x 2 user group 4096 2018-02-19 00:14:50 /blah-blah/anything -rw-r----- 1 someone users 2188 2018-07-21 13:52:59 /aaa/222 drwxr-S--- 2 someone users 4096 2018-06-25 14:27:42 /bbb/333/anything/whatever -rw-r----- 1 someone users 715 2018-06-16 20:09:58 /xxx/aaa/666 AlineN-1 AlineN 

Трубопровод:

(head -n 2; head -n 5 | sort -k8,8; cat) < data.txt 

Выход:

Zline1 Zline2 -rw-r----- 1 someone users 2188 2018-07-21 13:52:59 /aaa/222 drwxr-S--- 2 someone users 4096 2018-06-25 14:27:42 /bbb/333/anything/whatever drwxr-sr-x 2 user group 4096 2018-02-19 00:14:50 /blah-blah/anything drwxr-sr-x 2 user group 4096 2018-02-19 14:11:42 /something/project/somefile -rw-r----- 1 someone users 715 2018-06-16 20:09:58 /xxx/aaa/666 AlineN-1 AlineN 
Спасибо! Могу я также спросить: мой файл, содержащий список, также имеет N начальных и M конечных строк, которые не представлены в форме столбцов, показанной выше. К сожалению, сортировка портит их. Как я могу исключить эти строки и отсортировать только столбцы? george 5 лет назад 0
Смотрите мое обновление :-) Attie 5 лет назад 1
Спасибо! На самом деле я обнаружил, что `(голова -n; хвост -n +| голова-н -| сортировать -s -k8,8; хвост-н) <data.txt` также работает (без необходимости знать количество строк в «середине»). К сожалению, последние строки `M` отсутствуют, поэтому мне пришлось сделать это как отдельную строку в скрипте. Возможно, если вы знаете, как это передать (как я могу ошибаться), это было бы идеально :) Но это тоже работает! george 5 лет назад 0
Использование `tail` не будет работать, потому что он должен прочитать полный ввод, чтобы выяснить, сколько строк из конца использовать ... так что в этом случае последний` tail -n `ничего не получает в` stdin`, потому что предыдущий `tail -n +`взял все это! Attie 5 лет назад 0

Похожие вопросы