Jak przekonwertować znaczniki czasu w kolumnie na datę?

15

Mam plik zawierający to:

1415602803,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
1415602807,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
1415602811,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
1415602815,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

Chcę przekonwertować znacznik czasu na datę w tym formacie:

2014-11-10 02:00:03,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
2014-11-10 02:00:07,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
2014-11-10 02:00:11,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
2014-11-10 02:00:15,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

Jak mogę to zrobić?

Wiem, że to działa: perl -pe 's/(\d+)/localtime($1)/e'(z tego pytania ), ale format wyjściowy to Mon Nov 10 02:00:03 2014.

Wiem, że to polecenie może konwertować znaczniki czasu na pożądane dane wyjściowe:, date -d@1415602803 +"%F %H:%M:%S"ale nie mogłem sprawić, by działało z awkużyciem z system("cmd")powodu wszystkich cytatów i tak dalej.

Alaa Ali
źródło

Odpowiedzi:

6

Być może tak

perl -pe 'use POSIX qw(strftime); s/^(\d+)/strftime "%F %H:%M:%S", localtime($1)/e' 
Marki
źródło
17

Znaleziono coś tutaj: Stackoverflow - Konwertuj z unixtime w wierszu poleceń .

Wymyśliłem to:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","użyć separatora pól ,,
  • OFS=",";tak że pola wyjściowe są również oddzielone przez ,,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);zmienić wartość pierwszego pola $1na określony format, oraz
  • print $0; aby wydrukować całą linię.
Alaa Ali
źródło
2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'daje awk: line 2: function strftime never definedtutaj. Wyjaśnij, że NIE KAŻDY AWK ma strftime()! Aby uzyskać rozwiązanie działające w większości (wszystkich?) Zestawach AWK, użyj zewnętrznego datepolecenia, aby pozostać przenośnym.
2
@yeti, istnieje kilka dateimplementacji, które mogą konwertować daty między formatami jako rozszerzenie, ale sposób ich wykonania różni się całkowicie między implementacjami. Na przykład rozwiązanie podane przez Costasa wykorzystuje składnię specyficzną dla GNU date. Jeśli chcesz mieć przenośność, użyj perl.
Stéphane Chazelas,
4

Jeśli chcesz awk, możesz użyć zewnętrznego polecenia datew dowolnym formacie daty

awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'
Costas
źródło
+1 za NIEUŻYWANIE strftime()!
4
Zauważ, że użycie zewnętrznego polecenia spowoduje poważne pogorszenie wydajności, szczególnie zauważalne, gdy przetwarzanych jest wiele tysięcy wierszy
Jose Gómez
2

Możesz także spróbować:

cat test.txt | sed 's/^/echo "/; s/\([0-9]\{10\}\)/`date -d @\1`/; s/$/"/' | bash
kayn
źródło
2

Zadałem pytanie 9 miesięcy temu, które oznaczono jako duplikat tego. Dopiero teraz zobaczyłem prośbę o opublikowanie odpowiedzi, która działała dla mnie na to pytanie. Oto link do tego pytania i odpowiedzi.

/unix//a/304009/172916

Emily Shaffer
źródło