Манипулирую научным форматом без "е"

1 Посмотрите, где это работает

На Xubuntu он работает "из коробки", чтобы монтировать и извлекать USB-накопитель, разделы жесткого диска, CD / DVD и, возможно, многое другое.

Предположим, что решение, выбранное Ubuntu с помощью policyKit, достаточно безопасно.

2 Выберите соответствующую часть

В XFCE в Debian 8.3 мне нужно было разрешить пользователю монтировать и извлекать файловые системы из thunar без пароля. Что сработало для меня, так это выбор файла разрешений из Ubuntu.

Добавление строк ниже как root в файл с именем /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla должно помочь:

[Mounting, checking, etc. of internal drives]
Identity=unix-group:admin;unix-group:sudo
Action=org.freedesktop.udisks.filesystem-*;org.freedesktop.udisks.drive-ata-smart*;org.freedesktop.udisks2.filesystem-mount-system;org.freedesktop.udisks2.encrypted-unlock-system;org.freedesktop.udisks2.filesystem-fstab;
ResultActive=yes

3 Прибыль!

(На самом деле я выбрал немного больше из файла с таким же именем в Ubuntu 16.04, и это сработало для меня. Если вам это нужно, это в основном выглядит как содержимое https: //gist.github .com / kafene / 5b4aa4ebbd9229fa2e73 )

8
15.11.2019, 10:18
2 ответа

Верны ли эти выходные данные?

 1.056000e+0 5.000000e-1 2.454400e-3 2.914800e-2 8.141500e-6
 2.043430e+1 5.000000e-1 2.750500e-3 2.698100e-2-2.034300e-4
 3.829842e+1 5.000000e-1 1.969923e-2 2.211364e-2 9.499900e-6
 4.168521e+1 5.000000e-1 1.601262e-2 3.030919e-2-3.372000e-6
 6.661784e+1 5.000000e-1 5.250575e-2 3.443669e-2 2.585500e-5
 7.278104e+1 5.000000e-1 2.137055e-2 2.601701e-2 8.999800e-5
 9.077287e+1 5.000000e-1 1.320498e-2 2.961020e-2-1.011600e-5
 9.248130e+1 5.000000e-1 3.069610e-3 2.786329e-2-6.317000e-5
 1.049935e+2 5.000000e-1 4.218794e-2 3.321955e-2-5.097000e-6
 1.216283e+2 5.000000e-1 1.432105e-2 3.077165e-2 4.300300e-5

Код:

perl -lne 's/(\.\d+)(\+|\-)/\1e\2/g; print' sample

Пояснение:

  • -lneпозаботьтесь о концах строк, обработайте каждую строку ввода, выполните следующий код

  • s/(\.\d+)(\+|\-)/\1e\2/g:

    • замена(s)
    • (.\d+)(\+|\-)найти две группы из (точка и цифры )и (плюс или минус)
    • \1e\2замените их первой группой, затем e, затем второй группой
    • gглобально -не останавливаться на первой подстановке в каждой строке, а обрабатывать все возможные совпадения
  • printнапечатать строку

  • sampleвходной файл

Это добавляет пробел, если он отсутствует. На самом деле он помещает пробел между числами независимо. Т.е. если бы в каком-то случае было два пробела, в выводе был бы только один.

perl -lne 's/(\.\d+)(\+|\-)(\d+)(\s*)/\1e\2\3 /g; print' sample

Большая часть похожа на предыдущую. Новым является группа (\d+)номер 3 и группа (\s*)номер 4. *здесь означает необязательный. В замене не используется \4. Вместо этого есть место.

Вывод такой:

 1.056000e+0 5.000000e-1 2.454400e-3 2.914800e-2 8.141500e-6 
 2.043430e+1 5.000000e-1 2.750500e-3 2.698100e-2 -2.034300e-4 
 3.829842e+1 5.000000e-1 1.969923e-2 2.211364e-2 9.499900e-6 
 4.168521e+1 5.000000e-1 1.601262e-2 3.030919e-2 -3.372000e-6 
 6.661784e+1 5.000000e-1 5.250575e-2 3.443669e-2 2.585500e-5 
 7.278104e+1 5.000000e-1 2.137055e-2 2.601701e-2 8.999800e-5 
 9.077287e+1 5.000000e-1 1.320498e-2 2.961020e-2 -1.011600e-5 
 9.248130e+1 5.000000e-1 3.069610e-3 2.786329e-2 -6.317000e-5 
 1.049935e+2 5.000000e-1 4.218794e-2 3.321955e-2 -5.097000e-6 
 1.216283e+2 5.000000e-1 1.432105e-2 3.077165e-2 4.300300e-5 
14
27.01.2020, 20:09

Вы также можете использовать sed, например.:

<infile sed -E 's/([0-9])([+-])([0-9])/\1e\2\3/g' | awk '{ print $1 + 0 }'

Однако при этом не учитывается, что столбцы в листинге OP иногда не разделены. Вот обходной путь с соответствующей точностью:

<infile sed -E 's/.{11}/& /g'       |
sed -E 's/([0-9])([+-])/\1e\2/g'    |
gawk '{ print $1 + 0 }' OFMT='%.7g'

Выход:

1.056
20.4343
38.29842
41.68521
66.61784
72.78104
90.77287
92.4813
104.9935
121.6283
2
27.01.2020, 20:09

Теги

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