Необходимо связать дату и целое число, чтобы получить значение времени даты

Проблема, похоже, связана с ошибками, связанными с сборками GTK3 LibreOffice (смотрите здесь и здесь). Как выяснилось, единственный способ обойти это - вернуться к версии GTK2. Сначала вы должны быть уверены, что соответствующие пакеты установлены:

sudo apt install libreoffice-gtk libreoffice-gtk2

Затем вы можете запустить LibreOffice с GTK2 временно:

SAL_USE_VCLPLUGIN=gtk SAL_SYNCHRONIZE=1 libreoffice

Теперь он должен работать нормально. Если это так, вы можете удалить пакет GTK3, чтобы заставить LibreOffice постоянно использовать версию GTK2:

sudo apt purge libreoffice-gtk3

Позор на Canonical для доставки непроверенной версии LibreOffice!

6
задан 23 May 2018 в 08:32

8 ответов

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

awk -F, '/,/{printf "%s, %s, %s %02d:%02d, %s %02d:%02d\n",$1,$2,$1,int($3/100),$3%100,$1,int($4/100),$4%100}' YOUR_FILE.CSV

Или с кодом awk, отформатированным для лучшей читаемости:

/,/ { printf "%s, %s, %s %02d:%02d, %s %02d:%02d\n", $1, $2, $1, int($3 / 100), $3 % 100, $1, int($4 / 100), $4 % 100 }

На простом английском языке это выполняется в каждой строке, содержащей запятую (чтобы не обрабатывать пустые строки) и просто распечатывает соответствующий столбец значения (ввод разделяется запятой из-за -F,) с указанным форматом:

1-й столбец (дата), запятая, 2-й столбец (desc), запятая, 1-й столбец (дата), значение третьего столбца / 100 (час timestamp1), двоеточие, значение третьего столбца по модулю 100 (минуты метки времени1), запятая 1-й столбец (дата), значение 4-го столбца / 100 (час временной метки2), двоеточие, значение четвертого столбца по модулю 100 (минуты временной метки2)

Результатом ваших входных данных будет

2016-01-01, AAA, 2016-01-01 03:30, 2016-01-01 14:30 2016-01-02, ABA, 2016-01-02 01:30, 2016-01-02 09:30
11
ответ дан 17 July 2018 в 13:41

После версии Perl с помощью стратегии get-the-basic-elements и reformat-them

perl -ne '/((.*?),.*?, )(\d*)(\d\d), (\d*)(\d\d)/ and printf("%s%s %02d:%s, %s %02d:%s\n", $1,$2,$3,$4,$2,$5,$6)'
0
ответ дан 17 July 2018 в 13:41

Вы можете использовать awk для достижения желаемого результата. Я не уверен, что пустые строки между входом и выходом на самом деле есть или только проблема с форматированием, но я рассмотрел их в команде.

awk -F, '{if (NF) { print $1 "," $2 ", " $1 " " sprintf("%02d", int($3 / 100)) ":" $3 % 100 ", " $1 " " sprintf("%02d", int($4 / 100)) ":" $4 % 100 } else { print }}' < input.txt > output.txt

Что это делает:

-F, устанавливает разделитель входных полей awk на ,, поэтому вход разделяется правильно. if (NF) проверяет, больше ли число полей ввода больше нуля. Это для обработки пустых строк. Если строка пуста, else часть в конце команды напечатает пустую строку. Команда print печатает указанные поля: $1 - это первое поле ввода, дата "," печатает литеральную запятую $2 - это второе поле, описание ", " печатает следующую запятую $1. дата снова для вашей метки времени " " добавляет пробел между датой и временем sprintf("%02d", int($3 / 100)), сначала вычисляет часовую часть времени, деля время на 100, отбрасывая десятичные знаки (это делает int()) и печатает это число с ведущими нули с двумя цифрами (%02d% в качестве строки форматирования для sprintf() обрабатывает это) ":" снова просто буквальный двоеточие $3 % 100 - это операция по модулю, дающая остаток от деления времени на 100 и, следовательно, минуты ", " $1 " " sprintf("%02d", int($4 / 100)) ":" $4 % 100 то же самое для второй части времени else объясняется выше с помощью if. < input.txt сообщает оболочке читать вход awk s из указанного файла. > output.txt сообщает оболочке написать файл awk s в этот файл.
6
ответ дан 17 July 2018 в 13:41

Вот вариант perl (чей s/pattern/replacement/ имеет модификатор e, который позволяет оценивать выражение в замене):

perl -F', ' -lpe '$_ = join ",", @F[0,1], map { s/(\d?\d)(\d\d)/sprintf "%s %02d:%02d", $F[0], $1, $2/e ; $_ } @F[2,3] if @F ' file 2016-01-01, AAA, 2016-01-01 03:30, 2016-01-01 14:30 2016-01-02, ABA, 2016-01-02 01:30, 2016-01-02 09:30
4
ответ дан 17 July 2018 в 13:41

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

awk -F, '/,/{printf "%s, %s, %s %02d:%02d, %s %02d:%02d\n",$1,$2,$1,int($3/100),$3%100,$1,int($4/100),$4%100}' YOUR_FILE.CSV

Или с кодом awk, отформатированным для лучшей читаемости:

/,/ { printf "%s, %s, %s %02d:%02d, %s %02d:%02d\n", $1, $2, $1, int($3 / 100), $3 % 100, $1, int($4 / 100), $4 % 100 }

На простом английском языке это выполняется в каждой строке, содержащей запятую (чтобы не обрабатывать пустые строки) и просто распечатывает соответствующий столбец значения (ввод разделяется запятой из-за -F,) с указанным форматом:

1-й столбец (дата), запятая, 2-й столбец (desc), запятая, 1-й столбец (дата), значение третьего столбца / 100 (час timestamp1), двоеточие, значение третьего столбца по модулю 100 (минуты метки времени1), запятая 1-й столбец (дата), значение 4-го столбца / 100 (час временной метки2), двоеточие, значение четвертого столбца по модулю 100 (минуты временной метки2)

Результатом ваших входных данных будет

2016-01-01, AAA, 2016-01-01 03:30, 2016-01-01 14:30 2016-01-02, ABA, 2016-01-02 01:30, 2016-01-02 09:30
10
ответ дан 20 July 2018 в 13:46
  • 1
    Основное отличие от моих решений заключается в использовании sprintf для создания вывода, который мне нравится намного лучше, чем мое возиться со строками и переменными. – Lienhart Woitok 23 May 2018 в 00:46
  • 2
    Я очень ценю ваш ответ. Это очень полезно. – I Singh 24 May 2018 в 17:05

После версии Perl с помощью стратегии get-the-basic-elements и reformat-them

perl -ne '/((.*?),.*?, )(\d*)(\d\d), (\d*)(\d\d)/ and printf("%s%s %02d:%s, %s %02d:%s\n", $1,$2,$3,$4,$2,$5,$6)'
0
ответ дан 20 July 2018 в 13:46
  • 1
    Это очень полезно. Я очень ценю такое хорошее решение. – I Singh 27 May 2018 в 02:49

Вы можете использовать awk для достижения желаемого результата. Я не уверен, что пустые строки между входом и выходом на самом деле есть или только проблема с форматированием, но я рассмотрел их в команде.

awk -F, '{if (NF) { print $1 "," $2 ", " $1 " " sprintf("%02d", int($3 / 100)) ":" $3 % 100 ", " $1 " " sprintf("%02d", int($4 / 100)) ":" $4 % 100 } else { print }}' < input.txt > output.txt

Что это делает:

-F, устанавливает разделитель входных полей awk на ,, поэтому вход разделяется правильно. if (NF) проверяет, больше ли число полей ввода больше нуля. Это для обработки пустых строк. Если строка пуста, else часть в конце команды напечатает пустую строку. Команда print печатает указанные поля: $1 - это первое поле ввода, дата "," печатает литеральную запятую $2 - это второе поле, описание ", " печатает следующую запятую $1. дата снова для вашей метки времени " " добавляет пробел между датой и временем sprintf("%02d", int($3 / 100)), сначала вычисляет часовую часть времени, деля время на 100, отбрасывая десятичные знаки (это делает int()) и печатает это число с ведущими нули с двумя цифрами (%02d% в качестве строки форматирования для sprintf() обрабатывает это) ":" снова просто буквальный двоеточие $3 % 100 - это операция по модулю, дающая остаток от деления времени на 100 и, следовательно, минуты ", " $1 " " sprintf("%02d", int($4 / 100)) ":" $4 % 100 то же самое для второй части времени else объясняется выше с помощью if. < input.txt сообщает оболочке читать вход awk s из указанного файла. > output.txt сообщает оболочке написать файл awk s в этот файл.
6
ответ дан 20 July 2018 в 13:46
  • 1
    Я очень ценю ваш ответ. Это очень полезно. – I Singh 24 May 2018 в 17:05

Вот вариант perl (чей s/pattern/replacement/ имеет модификатор e, который позволяет оценивать выражение в замене):

perl -F', ' -lpe '$_ = join ",", @F[0,1], map { s/(\d?\d)(\d\d)/sprintf "%s %02d:%02d", $F[0], $1, $2/e ; $_ } @F[2,3] if @F ' file 2016-01-01, AAA, 2016-01-01 03:30, 2016-01-01 14:30 2016-01-02, ABA, 2016-01-02 01:30, 2016-01-02 09:30
4
ответ дан 20 July 2018 в 13:46
  • 1
    Я очень ценю ваш ответ. Это очень полезно. – I Singh 24 May 2018 в 17:05

Другие вопросы по тегам:

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