/ / Jak mogę przekonwertować plik pełen uniksowych ciągów czasowych na czytelne dla człowieka daty? - perl, bash, unix-timestamp

Jak mogę przekonwertować plik pełen łańcuchów czasu uniksowych na daty czytelne dla człowieka? - perl, bash, unix-timestamp

Przetwarzam plik pełen łańcuchów czasu unix. Chcę przekonwertować je wszystkie na czytelne dla ludzi.

Plik wygląda tak:

1153335401
1153448586
1153476729
1153494310
1153603662
1153640211

Oto skrypt:

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

To nie działa. Otrzymuję dane wyjściowe Czw 1 stycznia 00:00:00 1970 dla każdej linii. Myślę, że podziały linii są zbierane i dlatego nie działa. Jakieś pomysły? Używam Mac OSX, to robi różnicę.

Odpowiedzi:

9 dla odpowiedzi № 1
$ perl -lne "print skalar gmtime $ _" test.txt Środa 19 lipca 18:56:41 2006 Piątek 21 lipca 02:23:06 2006 Piątek 21 lipca 10:12:09 2006 Piątek 21 lipca 15:05:10 2006 Sob 22 lipca 21:27:42 2006 Sun 23 lipca 07:36:51 2006

3 dla odpowiedzi № 2

Bo $line jest w pojedynczych cudzysłowach, nie jest przetwarzany przez bash i tak dalej $line jest traktowany jako (niezdefiniowana) zmienna Perl, a nie zmienna bash.

Nie potrzebujesz while read pętla bash; Perl może sam wykonać pętlę używając jego -n opcja.

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

(używając -E, aby włączyć say, który automatycznie dołącza nową linię)


1 dla odpowiedzi nr 3

Nie używaj cat.

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

1 dla odpowiedzi nr 4

To nie jest podział linii, to jest to $line wewnątrz skryptu Perla jest inna zmienna niż $line w skrypcie bash. Możesz spróbować:

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

Zwróć uwagę na cudzysłowy, które pozwalają bashowi wykonywać zmienną interpolację.


0 dla odpowiedzi № 5

Nie ma potrzeby Perla:

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

0 dla odpowiedzi № 6

Problem polega na tym, że nie przypisałeś niczego do $line zmienna, więc domyślnie ma wartość zero, dlatego zawsze otrzymujesz Czw 1 stycznia 00:00:00 1970 jako wyjście.

odpowiedź gbacon jest tak gładki jak w Perlu.


0 dla odpowiedzi № 7

Rozwiązanie GNU date / xargs:

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

0 dla odpowiedzi № 8

To proste polecenie zrobi

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

0 dla odpowiedzi № 9

Nie zapominając, że localtime () może być użyty zamiast gmtime () w Perlu

Więc jeśli nie jesteś w Greenwich w zimie, możesz użyć localtime (), np.

Kod Perla:

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

wydajność:

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