/ / Як я можу конвертувати файл, повний часових рядків Unix, до людських читаних дат? - perl, bash, unix-timetamp

Як я можу перетворити файл, повний уніфікованих рядків часу, до людських читаних дат? - perl, bash, unix-timestamp

Я обробляю файл, наповнений тимчасовими рядками Unix. Я хочу перетворити їх усіх на читабельні для людини.

Файл виглядає так:

1153335401
1153448586
1153476729
1153494310
1153603662
1153640211

Ось скрипт:

#! /bin/bash
FILE="test.txt"
cat $FILE | while read line; do
perl -e "print scalar(gmtime($line)), "n""
done

Це не працює. Вихід, який я отримую, - це Чт 1 січня 00:00:00 1970 для кожного рядка Я думаю, що перерив рядків підбирається, і тому це не працює. Будь-які ідеї? Я використовую Mac OSX - це те, що має будь-яке значення.

Відповіді:

9 для відповіді № 1
$ perl -lne "друкувати скалярний gmtime $ _" test.txt Ср. 19 липня 18:56:41 2006 Пт 21 липня 02:23:06 2006 Пт 21 липня 10:12:09 2006 Пт 21 липня 15:05:10 2006 Сб 22 липня 21:27:42 2006 Нд 23 липня 07:36:51 2006

3 для відповіді № 2

Оскільки $line знаходиться в одинарних лапках, це не обробляється bash, і так $line трактується як (невизначена) змінна Perl, а не баш-змінна.

Ви не потребуєте а while read петля-баш; Perl може робити циклічне використання, використовуючи його -n варіант

perl -nE "say scalar(gmtime($_))" test.txt

(використовуючи -E для включення say, яка автоматично додає новий рядок)


1 для відповіді № 3

Не використовуйте cat.

#! /bin/bash
file="test.txt"
while read line
do
date -d @$line
done < "$file"

1 для відповіді № 4

Це "не перерив лінії, це" $line всередині сценарію Perl є різною змінною, ніж $line в сценарії bash. Ви можете спробувати:

perl -e "print scalar(gmtime($line)),qq/\n/"

Зверніть увагу на подвійні лапки, які дозволяють bash робити змінну інтерполяцію.


0 для відповіді № 5

Не потрібно Perl:

awk "{ print strftime("%c", $0) }" somefile.txt

0 для відповіді № 6

Проблема полягає в тому, що ви нічого не призначили $line змінна, тому вона за замовчуванням до нульового значення, саме тому ви завжди отримуєте Чт 1 січня 00:00:00 1970 як вихід.

відповідь gbacon приблизно так само гладко, як це стає в Perl.


0 для відповіді № 7

Рішення щодо дати / xargs GNU:

  xargs -i  date -d "1970-01-01 00:00:00 {} seconds"  </tmp/timestamps

0 для відповіді № 8

Ця проста команда зробить

 cat time.txt | while read line; do date -ud @$line; done > string.txt

0 для відповіді № 9

Не забуваючи, що в Perl замість gmtime () можна використовувати замість gmtime ()

Отже, якщо ви "не перебуваєте в Грінвічі взимку, ви можете використовувати localtime (), наприклад,

Код Perl:

    my $unixtime = 1417014507;
my $humantime = localtime($unixtime);
print "$humantime = $humantime n";

вихід:

    $humantime = Wed Nov 26 15:08:27 2014