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