Сортировка блоков строк

Просто используйте что-то как:

ls -lS /path/to/folder/

Капитал S.

Это отсортирует файлы по размеру.

Также см.:

man ls

-S     sort by file size

Если Вы хотите отсортировать в обратном порядке, просто добавьте -r переключатель.

Обновление:

Для исключения каталогов (и если ни одни из имен файлов или целей символьной ссылки не содержат символы новой строки):

ls -lS | grep -v '^d' 

Обновление 2:

Я вижу теперь, как это все еще показывает символьные ссылки, которые могли быть папками. Символьные ссылки всегда начинаются с буквы l, как в ссылке.

Измените команду для фильтрации для a -. Это должно только оставить регулярные файлы:

ls -lS | grep '^-'

В моей системе это только показывает регулярные файлы.

обновление 3:

Для добавления рекурсии я оставил бы сортировку строк к sort управляйте и скажите этому использовать 5-й столбец для вида на.

ls -lR | grep '^-' | sort -k 5 -rn

-rn средства, Обратные и числовые для получения самых больших файлов наверху. Вниз сторона этой команды - то, что она не показывает полный путь файлов.

При необходимости в полном пути файлов используйте что-то вроде этого:

find . -type f  -exec du -h {} + | sort -r -h

find команда рекурсивно найдет все файлы во всех подкаталогах . и звоните du -h (значение использования диска - человекочитаемый), и затем сортируют вывод снова. Если Ваш find/sort не поддерживает -h, замена du -k и sort -rn. Обратите внимание, что размер и использование диска не являются тем же самым.

12
10.11.2013, 21:43
6 ответов

Опции состоят в том, чтобы использовать , чтобы добавить, что начальный порядковый номер снабжает префиксом каждый строки N (N=4 в Вашем случае). Затем подайте префикс как основной столбец сортировки в sort.

Пример с N=4:

awk '{print int((NR-1)/4), $0}' file.txt | sort -n -k1,1 -k2,2 | cut -f2- -d' '
17
27.01.2020, 19:54

Можно сделать это с Perl:

perl -nle '
   push @a,$_;
   unless($. % 4){
       print join "\n",sort {$a <=> $b} @a; # Sort @a, and print its contents
       @a = (); # Empty @a to start a new block
   }
' your_file

Как это работает

  • -n -> выполняет код для каждой входной строки (и вставьте текущую строку $_)
  • -l -> добавляют новую строку к выводу любого print
  • -e -> выполняют следующую строку как код Perl
  • Каждая строка добавляется к массиву @a.
  • $. содержит текущий номер строки и если то число не является конгруэнтным для обнуления по модулю 4, затем мы продолжаем работать. Если это является конгруэнтным для обнуления по модулю 4, мы достигли строки, число которой является кратным 4 (конец блока), в этом случае, мы сортируем записи в @a в возрастающем числовом порядке и печати записи в сортированном массиве, к которому присоединяется новая строка к стандартному выводу.
3
27.01.2020, 19:54

Если это - то прочь, и Вы не хотите изучать Python, жемчуг или awk, можно пойти с основным split и sort команды.

Сначала разделите файл в 4 блоках строки с -l опция:

split -a 6 -l 4 input_file my_prefix_
for fn in my_prefix_*; do
    sort -n -o $fn $fn
done
cat my_prefix_* > output_file
rm my_prefix_*

sort -n виды численным значением первого столбца (999 до 1234). -a 6 должен заботиться о файле с 26^6*4 строки. my_prefix_ должно быть что-то уникальное для каталога, с которым Вы работаете.

7
27.01.2020, 19:54

Используя подобную Границе оболочку,

while read a ; do                                           # Try reading a line.
    read b ; read c ; read d                                # OK, read 3 more.
    printf '%s\n%s\n%s\n%s\n' "$a" "$b" "$c" "$d" | sort -n # Sort them.
done < data
2
27.01.2020, 19:54

Можно получить чистое решение с R. Если приведенная выше таблица находится в файле под названием "table.txt", то выполните следующие шаги. Желаемым результатом будет в файле "tableout.txt".

> x = read.table("table.txt", col.names=c("a", "b"))
> x
     a        b
1 6115  8.88443
2 6116  6.61875
3 6118 16.59490
4 6117 19.41290
5 6116  6.61900
6 6117 16.59790
7 6118 19.41110
8 6115  8.88433
> x["index"] = c(rep(1, 4), rep(2, 4))
> x
     a        b index
1 6115  8.88443     1
2 6116  6.61875     1
3 6118 16.59490     1
4 6117 19.41290     1
5 6116  6.61900     2
6 6117 16.59790     2
7 6118 19.41110     2
8 6115  8.88433     2     
> xord = x[with(x, order(index, a)), ]
> xord
     a        b index
1 6115  8.88443     1
2 6116  6.61875     1
4 6117 19.41290     1
3 6118 16.59490     1
8 6115  8.88433     2
5 6116  6.61900     2
6 6117 16.59790     2
7 6118 19.41110     2
> write.table(xord[,1:2], "tableout.txt", row.names=FALSE, col.names=FALSE)

См. также, Как отсортировать кадр данных по столбцу (столбцам) в R.

1
27.01.2020, 19:54

Вот несколько «чистых» awkрастворов:

Если индексы всегда представляют собой одну и ту же возрастающую целочисленную последовательность (6115 -6119 ), как в вашем образце данных -, вы можете использовать алгоритмический «ярлык»:

awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'

Это делает

  • Добавить все строки в массив a, распределенные по позициям индекса 6115 -6119
  • В каждой 4-й строке(!(NR%4))выполните цикл по содержимому массива для печати в нужном порядке.

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

awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'

Примечание :Это относится к GNU awk, другие могут не поддерживать asort.


Если бы каждый блок -из -четырех мог иметь разные числовые идентификаторы:

awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;print a[i++]); delete a}'

Примечание :TIL от @Gilles self -ответ (+2 )это использование deleteеще не ()POSIX, но повсеместно поддерживается .


Версия с правильным™ использованиемdelete:

awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;delete a[i++]){print a[i]}}'

Версия без удаления, использующая больше памяти и размеров:

awk '{a[n][$1]=$0} !(NR%4){asort(a[n]); for(i=1;i<5;print a[n][i++]); n++}
2
27.01.2020, 19:54

Теги

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