Bash и сортировать файлы по порядку - PullRequest
29 голосов
/ 17 ноября 2009

с помощью предыдущего скрипта bash я создал список файлов:

data_1_box
data_2_box
...
data_10_box
...
data_99_box

Дело в том, что теперь мне нужно объединить их, поэтому я попытался

ls -l data _ *

но я получаю

.....
data_89_box
data_8_box
data_90_box
...
data_99_box
data_9_box

но мне нужно попасть в последовательность 1, 2, 3, 4, .. 9, ..., 89, 90, 91, ..., 99

Можно ли это сделать в bash?

Ответы [ 7 ]

61 голосов
/ 17 ноября 2009
ls data_* | sort -n -t _ -k 2

-n: сортировка по номеру
-t: разделитель полей '_'
-k: отсортировать по второму полю, в вашем случае числа после первого '_'

20 голосов
/ 17 ноября 2009

Как насчет использования флага -v для ls? Целью флага является сортировка файлов по номеру версии, но здесь он работает так же хорошо и устраняет необходимость передачи результата в sort:

ls -lv data_*
8 голосов
/ 17 ноября 2009

Если ваш sort имеет версию сортировки, попробуйте:

ls -1 | sort -V

(это заглавная V).

2 голосов
/ 17 ноября 2009

Это общий ответ! Вы должны применить правила к конкретному набору данных

ls | sort

Пример:

ls | sort -n -t _ -k 2
1 голос
/ 30 апреля 2010

может быть, вам понравится SistemaNumeri.py («исправить номера»): он переименует ваш

data_1_box
data_2_box
...
data_10_box
...
data_99_box

в

data_01_box
data_02_box
...
data_10_box
...
data_99_box
1 голос
/ 30 апреля 2010

Вот способ сделать это в bash, если у вашей сортировки нет версии:

cat <your_former_ls_output_file> | awk ' BEGIN { FS="_" } { printf( "%03d\n",$2) }' | sort | awk ' { printf( "data_%d_box\n", $1)  }'

Все в одной строке. Имейте в виду, я не проверял это на ваших конкретных данных, поэтому может потребоваться небольшая настройка для правильной работы для вас. Это обрисовывает в общих чертах хорошее, надежное и относительно простое решение, все же. Конечно, вы всегда можете поменять имя файла cat + в начале на фактическое значение ls, чтобы создать данные файла на лету. Для захвата фактического столбца имени файла вы можете выбрать между правильными параметрами ls или передачей через cut или awk.

0 голосов
/ 17 ноября 2009

Одно предложение, о котором я могу подумать, это:

for i in `seq 1 5`
do  
   cat "data_${i}_box"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...