вызов подстановки sed со специальными символами

Для имен файлов одинаковой глубины.

filearray=("dir1/0010.pdf" "dir2/0003.pdf" "dir3/0040.pdf" "dir3/0014.pdf")

sorted_file_array=($(printf "%s\n" "${filearray[@]}" | sort -n -t'/' -k2))

Пояснение

-k POS1[,POS2] - The recommended, POSIX, option for specifying a sort field. The field consists of the part of the line between POS1 and POS2 (or the end of the line, if POS2 is omitted), inclusive. Fields and character positions are numbered starting with 1. So to sort on the second field, you'd use `-k 2,2'.

-t SEPARATOR Use character SEPARATOR as the field separator when finding the sort keys in each line. By default, fields are separated by the empty string between a non-whitespace character and a whitespace character.

Информация взята от человека рода.

Печать результирующего массива

printf "%s\n" "${sorted_file_array[@]}"
dir2/0003.pdf
dir1/0010.pdf
dir3/0014.pdf
dir3/0040.pdf

0
30.12.2019, 20:15
2 ответа

Предположим, что 1T = 1000G.

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

Давайте разберем необходимые изменения. Сначала измените отдельные поля с T, но без точек, на поля с «.000». Нужна «g», так как есть 2 поля. Обратите внимание, что поскольку у нас есть хорошая запятая для начала поля, воспользуйтесь ею.

  s/\(,[0-9]*\)T/\1.000T/g

Теперь небольшая подчистка на случай, если есть поля без 3 знаков после запятой. Добавьте 3 нуля, если после точки ничего нет, 2 нуля, если есть одна цифра, ноль, если есть две цифры, и удалите все лишние цифры после третьей (, т.е. усечение, а не округление ).

s/\(,[0-9]*\.\)T/\1000T/g
s/\(,[0-9]*\.[0-9]\)T/\100T/g
s/\(,[0-9]*\.[0-9][0-9]\)T/\10T/g
s/\(,[0-9]*\.[0-9][0-9][0-9]\)[0-9]*T/\1T/g

Теперь измените T на G, опустив точку.

s/\(,[0-9]*\)\.\([0-9][0-9][0-9]\)T/\1\2G/g

Теперь, чтобы быть любезным, отбросьте ведущие нули

s/,0*\([1-9][0-9]*G\)/,\1/g

Объединение всех команд вместе и передача выборочных данных приводит к

ftwepsiprdsql02,ftwepsiprdsql02_F,2001G,1680G
ftwepsiprdsql02,ftwepsiprdsql02_G,801G,176.786G
ftwepsiprdsql02,ftwepsiprdsql02_H,501G,6.565G
ftwepsiprdsql02,ftwepsiprdsql02_I,1001G,539.504G
ftwepsiprdsql02,ftwepsiprdsql02_J,501G,478.211G                                                                                                        
ftwepsiprdsql02,ftwepsiprdsql02_X,1501G,68.021G
rxi0738_foc_cl1,rxi0738_foc_cl1_lun248,8000G,4450G
rxi0738_foc_cl1,rxi0738_foc_cl1_lun250,8000G,5857G
rxi0738_foc_cl1,rxi0738_foc_cl1_lun252,8000G,4681G
rxi0738_foc_cl1,rxi0738_foc_cl1_lun254,8000G,4657G
0
28.01.2020, 02:38

Если у вас есть numfmtот GNU Coreutils:

$ numfmt -d, --field=3,4 --from=auto --round=nearest < file | 
    numfmt -d, --field=3,4 --to-unit=G --suffix=G
ftwepsiprdsql02,ftwepsiprdsql02_F,2001G,1680G
ftwepsiprdsql02,ftwepsiprdsql02_G,801G,177G
ftwepsiprdsql02,ftwepsiprdsql02_H,501G,7G
ftwepsiprdsql02,ftwepsiprdsql02_I,1001G,540G
ftwepsiprdsql02,ftwepsiprdsql02_J,501G,479G
ftwepsiprdsql02,ftwepsiprdsql02_X,1501G,69G
rxi0738_foc_cl1,rxi0738_foc_cl1_lun248,8000G,4450G
rxi0738_foc_cl1,rxi0738_foc_cl1_lun250,8000G,5857G
rxi0738_foc_cl1,rxi0738_foc_cl1_lun252,8000G,4681G
rxi0738_foc_cl1,rxi0738_foc_cl1_lun254,8000G,4657G

Как вариант, с Perl:

perl -F, -pe '
  $_ = join ",", map { $_ =~ s/^(\d*(\.\d+)?)T$/sprintf "%.0fG", 1000*$1/e; $_ } @F
' file
1
28.01.2020, 02:38

Теги

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