Ответ 1
ls data_* | sort -n -t _ -k 2
-n: сортирует численно
-t: разделитель полей '_'
-k: сортировать по второму полю, в вашем случае числа после первого '_'
с предыдущим 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?
ls data_* | sort -n -t _ -k 2
-n: сортирует численно
-t: разделитель полей '_'
-k: сортировать по второму полю, в вашем случае числа после первого '_'
Как использовать флаг -v
для ls
? Целью флага является сортировка файлов в соответствии с номером версии, но она также работает здесь и устраняет необходимость подключения результата к sort
:
ls -lv data_*
Если ваш sort
имеет сортировку версии, попробуйте:
ls -1 | sort -V
(что капитал V).
Это общий ответ! Вы должны применять правила к определенному набору данных
ls | sort
Пример:
ls | sort -n -t _ -k 2
Здесь способ сделать это в 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.
возможно, вам понравится 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
Одно из предложений, о котором я могу думать, следующее:
for i in `seq 1 5`
do
cat "data_${i}_box"
done