Получите время эпохи и добавьте его в качестве нового столбца

Им это не гарантируется. Возможно, /foo/oldPathявляется точкой монтирования.

Однако это можно легко проверить, запустив mount | grep 'on /foo/oldPath'Ни один вывод не должен указывать на то, что каталог oldPathне является точкой монтирования.

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

Я не уверен, что это автоматизировано, но стоит отметить, что третье поле из mount (, разделенное пробелом -), является точкой монтирования для каждой строки, поэтому использование cut -d ' ' -f 3может быть используется для извлечения пути (, если вам нужно убедиться, что это не просто подстрока другой точки монтирования, например/foo/oldPath/nested/mountPoint)

Если вы хотите перевести это в код C/C++, вы можете использовать system("mount | grep 'on /foo/oldPath'"), но я не буду на этом клянусь. Возможно, вам повезет больше на StackOverflow, где вы найдете более подробную информацию о реализации, если вам это нужно.

0
05.05.2020, 03:28
3 ответа

Использование GNU awkи mktime:

awk '
  BEGIN{ FS=OFS="\t" }
  FNR==1{ print $0, "c"; next }
  {
    split($2, a, /[ :-]/)
    print $0, mktime(a[1]" "a[2]" "a[3]" "a[4]" "a[5]" "a[6], 1)
  }
' file
  • Использовать табуляцию в качестве разделителя полей ввода и вывода
  • Добавить cк строке заголовка
  • Разделить второе поле на массив a, используя пробел, :и -в качестве разделителей. и распечатайте временную метку, используя флаг UTC

Выход:

a       b       c
0       2020-03-03 15:46:52     1583250412
1       2020-03-02 11:05:17     1583147117
2
28.04.2021, 23:16

Не уверен, что это подойдет для больших файлов, но попробуйте сделать что-то подобное с Miller

$ TZ=UTC mlr --pprint --fs tab put -S '$c = strftime(strptime($b,"%Y-%m-%d %H:%M:%S"),"%s")' file
a   b                                   c
0   2020-03-03 15:46:52 1583250412
1   2020-03-02 11:05:17 1583147117

(хотя я только что заметил, что выравнивание заголовка, по-видимому, искажается, когда OFS находится на вкладке... ).

0
28.04.2021, 23:16

Использование GNU dateв bashили любой другой оболочки, поддерживающей подстановку процессов:

$ paste file <( echo c; date -u -f <( cut -f 2 file | sed 1d ) +%s )
a       b       c
0       2020-03-03 15:46:52     1583250412
1       2020-03-02 11:05:17     1583147117

Самая внутренняя подстановка процесса, <( cut -f 2 file | sed 1d ), создает второй столбец исходных данных (временных меток )с удаленным заголовком. Эти временные метки передаются в GNU dateчерез его опцию -fиз подстановки процесса, и они преобразуются в секунды Unix с использованием строки выходного формата %s. Опция -uдля GNU dateзаставляет печатать время UTC вместо местного времени.

Подстановка внешнего процесса, <( echo c; date... ), выводит заголовок для нового столбца, а затем создает данные для этого столбца.

Затем он вставляется как новый столбец существующих данных с помощью paste.

0
28.04.2021, 23:16

Теги

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