Раздел awk не работает

Временное изменение режимов округления не такое уж необычное, и это возможно с помощью bin / printf , хотя не как такового , вам нужно изменить источники.

Вам нужны исходные коды coreutils, я использовал последнюю доступную сегодня версию, которая была http://ftp.gnu.org/gnu/coreutils/coreutils-8.24.tar.xz .

Распакуйте в каталог по вашему выбору с помощью

tar xJfv coreutils-8.24.tar.xz

Перейдите в исходный каталог

cd coreutils-8.24

Загрузите файл src / printf.c в выбранный вами редактор и замените всю функцию main следующей функцией, включая обе директивы препроцессора, чтобы включить файлы заголовков math.h и fenv.h . Основная функция находится в конце и начинается с int main ... и заканчивается в самом конце файла закрывающей скобкой }

#include 
#include 
int
main (int argc, char **argv)
{
  char *format;
  char *rounding_env;
  int args_used;
  int rounding_mode;

  initialize_main (&argc, &argv);
  set_program_name (argv[0]);
  setlocale (LC_ALL, "");
  bindtextdomain (PACKAGE, LOCALEDIR);
  textdomain (PACKAGE);

  atexit (close_stdout);

  exit_status = EXIT_SUCCESS;

  posixly_correct = (getenv ("POSIXLY_CORRECT") != NULL);
  // accept rounding modes from an environment variable
  if ((rounding_env = getenv ("BIN_PRINTF_ROUNDING_MODE")) != NULL)
    {
      rounding_mode = atoi(rounding_env);
      switch (rounding_mode)
        {
        case 0:
          if (fesetround(FE_TOWARDZERO) != 0)
            {
              error (0, 0, _("setting rounding mode to roundTowardZero failed"));
              return EXIT_FAILURE;
            }
          break;
       case 1:
          if (fesetround(FE_TONEAREST) != 0)
            {
              error (0, 0, _("setting rounding mode to roundTiesToEven failed"));
              return EXIT_FAILURE;
            }
          break;
       case 2:
          if (fesetround(FE_UPWARD) != 0)
            {
              error (0, 0, _("setting rounding mode to roundTowardPositive failed"));
              return EXIT_FAILURE;
            }
          break;
       case 3:
          if (fesetround(FE_DOWNWARD) != 0)
            {
              error (0, 0, _("setting rounding mode to roundTowardNegative failed"));
              return EXIT_FAILURE;
            }
          break;
       default:
         error (0, 0, _("setting rounding mode failed for unknown reason"));
         return EXIT_FAILURE;
      }
    }
  /* We directly parse options, rather than use parse_long_options, in
     order to avoid accepting abbreviations.  */
  if (argc == 2)
    {
      if (STREQ (argv[1], "--help"))
        usage (EXIT_SUCCESS);

      if (STREQ (argv[1], "--version"))
        {
          version_etc (stdout, PROGRAM_NAME, PACKAGE_NAME, Version, AUTHORS,
                       (char *) NULL);
          return EXIT_SUCCESS;
        }
    }

  /* The above handles --help and --version.
     Since there is no other invocation of getopt, handle '--' here.  */
  if (1 < argc && STREQ (argv[1], "--"))
    {
      --argc;
      ++argv;
    }

  if (argc <= 1)
    {
      error (0, 0, _("missing operand"));
      usage (EXIT_FAILURE);
    }

  format = argv[1];
  argc -= 2;
  argv += 2;

  do
    {
      args_used = print_formatted (format, argc, argv);
      argc -= args_used;
      argv += args_used;
    }
  while (args_used > 0 && argc > 0);

  if (argc > 0)
    error (0, 0,
           _("warning: ignoring excess arguments, starting with %s"),
           quote (argv[0]));

  return exit_status;
}

Run ./ configure следующим образом

LIBS = -lm ./configure --program-suffix = -own

Он помещает суффикс -own в каждую подпрограмму (их много) на всякий случай, если вы хотите установить их все и не уверены, подходят ли они к остальной системе. Coreutils не названы core utils без причины!

Но наиболее важным является LIBS = -lm перед строкой. Нам нужна математическая библиотека, и эта команда сообщает ./ configure , чтобы добавить ее в список необходимых библиотек.

Запустите make

make

Если у вас многоядерная / многопроцессорная система, попробуйте

make -j4

, где число (здесь «4») должно представлять количество ядер, которое вы хотите сэкономить. для этой работы.

Если все прошло хорошо, у вас есть новый printf int src / printf . Попробуйте:

BIN_PRINTF_ROUNDING_MODE = 1 ./src/printf '% .0f \ n' 196.5

BIN_PRINTF_ROUNDING_MODE = 2 ./src/printf '% .0f \ n' 196.5

Обе команды должны отличаться выход. Числа после IN_PRINTF_ROUNDING_MODE означают:

  • 0 Округление в сторону 0
  • 1 Округление до ближайшего числа (по умолчанию)
  • 2 Округление в сторону положительной бесконечности
  • 3 Округление в сторону отрицательной бесконечности

Вы можете установить весь файл (не рекомендуется) или просто скопировать файл (настоятельно рекомендуется переименовать его!) src / printf в каталог на вашем ] PATH и используйте, как описано выше.

2
06.06.2018, 15:34
1 ответ

Descargué y descomprimí el archivo, y los finales de línea son CRLF, por lo que debe tener en cuenta eso, ya sea utilizando una herramienta como fromdos, o si no desea modificar el archivo, puede hacerlo dígale a Perl que quiere que haga la traducción con su capa:crlfPerlIO , que es lo que estoy haciendo a continuación con la variable de entorno PERLIO. (Hay otras formas de cambiar las capas, pero esta fue la más fácil para una sola línea -.)

Estoy usando el operador flip -flop...para extraer solo el párrafo que coincide con la expresión regular más el siguiente que coincide con/^1\./(ya que todos los párrafos en el archivo comienzan con [o1.).

wget http://kingbase-chess.net/download/650 -O KingBaseLite2018-03.zip
unzip KingBaseLite2018-03.zip
PERLIO=:crlf perl -00ne 'print if /"FIDE Candidates 2018"/.../^1\./' KingBaseLite2018-03.pgn
3
27.01.2020, 22:02

Теги

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