Как получить числа после десятичной точки в алфавитном порядке сортировки в Bash - PullRequest
0 голосов
/ 05 октября 2018

У меня есть скрипт .sh, который проходит через каждую папку в родительской папке и запускает program в каждой.Я использовал следующий код:

for d in ./*/
do cp program "$d"
(cd "$d" ; ./program)
done

program, помимо прочего, получает имя каждой папки и записывает его в файл data.dat, чтобы все имена папок были там перечислены.Имена этих папок являются числами (десятичными), которые идентифицируют их содержимое.program записывает имя папки в data.dat при входе в каждую папку, чтобы они отображались в порядке, в котором Bash просматривает папки.

Я хочу, чтобы они были отсортированы, в data.dat,в алфавитном порядке, поместив младшие числа перед более высокими, независимо от того, являются ли они однозначными или двузначными числами.Например, я хочу, чтобы 2.32 предшествовал 10.43, а не наоборот.

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

Заранее спасибо!

РЕДАКТИРОВАТЬ: program в Fortran 77 и выглядит следующим образом:

`программа getData

  implicit none

  character counter*20, ac*4, bash*270, Xname*4, fname*15  
  double precision Qwallloss, Qrad, Nrad, Qth, QreacSUM
  double precision Xch4in, Ych4in, length, porosity, Uin, RHOin
  double precision MFLR, Area, Xvalue
  integer I

  bash="printf '%s\n'"//' "${PWD##*/}" > RunNumber.txt' 
  call system(bash)                   !this gets the folder name and writes 
                                      !to RunNumber.txt

  open(21, form="FORMATTED", STATUS="OLD", FILE="RunNumber.txt")
  rewind(21)
  read(21,*) counter            !brings the folder name into the program
  close(21)

  `

(...) `

  call system(' cp -rf ../PowerData.dat . ')

  open(27, form="FORMATTED", STATUS="OLD", ACCESS="APPEND", !the new row is appended to the existing file
 1       FILE="PowerData.dat")

  write(27,600) Counter, Xvalue, Nrad, Qrad, Qth,  !writes a row of variables, 
 1     Area, MFLR, Uin, RHOin, Xch4in, Ych4in   !starting with the folder name, 
                                                !to the Data file
  close(27)

  call system('cp -rf PowerData.dat ../')


  end program`

1 Ответ

0 голосов
/ 05 октября 2018

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

for d in ./*/ ; do
    echo "$d"a >> /tmp/tmpfile
done
for d in $(sort -n  /tmp/tmpfile) ; do
    cp program "$d"
    (cd "$d" ; ./program)
done

Есть и другие способы сделать это;например:

for d in $(ls | sort -n) ; do

(некоторые будут обвинять меня в разборе вывода ls) и так далее.

Так что если вы сделаете:

mkdir test
cd test
touch 100
touch 2.00
touch 50.1

ls даст вам

100  2.00  50.1

ls | sort -n даст вам

2.00
50.1
100

и, в качестве бонуса, ls -v даст вам

2.00  50.1  100
...