Подтвердить что ты не робот

Bash и сортировать файлы по порядку

с предыдущим bash script Я создал список файлов:

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?

4b9b3361

Ответ 1

ls data_* | sort -n -t _ -k 2

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

Ответ 2

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

ls -lv data_*

Ответ 3

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

ls -1 | sort -V

(что капитал V).

Ответ 4

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

ls | sort

Пример:

ls | sort -n -t _ -k 2

Ответ 5

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

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

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

Ответ 6

возможно, вам понравится SistemaNumeri.py ( "fix numbers" ): он переименовывает ваш

data_1_box
data_2_box
...
data_10_box
...
data_99_box

в

data_01_box
data_02_box
...
data_10_box
...
data_99_box

Ответ 7

Одно из предложений, о котором я могу думать, следующее:

for i in `seq 1 5`
do  
   cat "data_${i}_box"
done