Замена даты на EPOCH в выводе столбца

Вы можете использовать опцию mdfind's -0вместе с xargs, чтобы найденные имена заканчивались символом NUL (и, следовательно, не нужно было беспокоиться о пробелах/табуляциях/новой строке и т. д. ).

read -e -p 'Path? ' path
mdfind -0 -name 'kMDItemWhereFroms="*"' -onlyin "$path" | xargs -0 mdls

Если вы хотите видеть пути/имена файлов (, а не только вывод mdls), это становится немного более сложным:

mdfind -0 -name 'kMDItemWhereFroms="*"' -onlyin "$path" | \
    xargs -0 -n 1 sh -c 'echo "$1" && mdls "$1"' _

(_в конце — это просто синтаксический сахар для sh, который назначит первый аргумент, обычно имя команды, для$0)

5
24.09.2020, 20:47
2 ответа

printпо умолчанию добавляет новую строку. Используйтеprintf:

awk '{printf "%s %s ",$1,$2; system("date -d "$3" +%s")}' data

Если был определен специальный разделитель полей вывода OFS, вы могли бы использовать

awk '{printf "%s%s%s%s",$1,OFS,$2,OFS; system("date -d "$3" +%s")}' data

Обратите внимание, что каждый %sполучает один из оставшихся аргументов для printf.

Выход:

user1 1234 1577847600
user2 2345 1580612400
6
18.03.2021, 23:02

Если у вас есть GNU awk (, также известный как gawk), вы можете использовать его встроенную -функцию времени mktime(, хотя формат ввода даты сначала требует некоторых манипуляций):

$ gawk 'split($3,a,"/") {$3 = mktime(sprintf("%04d %02d %02d 00 00 00",a[3],a[2],a[1]))} 1' data
user1 1234 1577854800
user2 2345 1580619600

В качестве альтернативы Миллер предлагает стиль C -strptimeиstrftime:

$ mlr --nidx put '$3 = strftime(strptime($3,"%d/%m/%Y"),"%s")' data
user1 1234 1577854800
user2 2345 1580619600

или аналогично в Perl, с модулем Time ::Piece:

$ perl -MTime::Piece -alne '
    $t = pop @F; print join " ", @F, Time::Piece->strptime($t,"%d/%m/%Y")->strftime("%s")
  ' data
user1 1234 1577854800
user2 2345 1580619600
6
18.03.2021, 23:02

Теги

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