Làm cách nào tôi có thể chuyển đổi dấu thời gian trong một cột thành một ngày?


15

Tôi có một tập tin chứa cái này:

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

Tôi muốn chuyển đổi dấu thời gian thành một ngày ở định dạng này:

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

Làm thế nào tôi có thể làm điều đó?

Tôi biết điều này hoạt động: perl -pe 's/(\d+)/localtime($1)/e'(từ câu hỏi này ) nhưng định dạng đầu ra là Mon Nov 10 02:00:03 2014.

Tôi biết lệnh này có thể chuyển đổi dấu thời gian thành đầu ra mong muốn của tôi: date -d@1415602803 +"%F %H:%M:%S"nhưng tôi không thể làm cho nó hoạt động bằng awkcách sử dụng system("cmd")vì tất cả các trích dẫn và không có gì.

Câu trả lời:


6

Như thế này có lẽ

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

17

Tìm thấy một cái gì đó ở đây: Stackoverflow - Chuyển đổi từ unixtime tại dòng lệnh .

Đến với điều này:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","sử dụng thiết bị tách lĩnh vực ,,
  • OFS=",";sao cho các trường đầu ra cũng được phân tách bằng a ,,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);để thay đổi giá trị của trường đầu tiên $1thành định dạng đã chỉ định và
  • print $0; để in toàn bộ dòng.

2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'đưa ra awk: line 2: function strftime never definedở đây. Hãy làm rõ rằng KHÔNG MỌI THỨ AWK có strftime()! Đối với một giải pháp chạy trong hầu hết (tất cả?) AWK, vui lòng sử dụng datelệnh bên ngoài để luôn di động.

2
@yeti, có một vài datetriển khai có thể chuyển đổi ngày giữa các định dạng dưới dạng tiện ích mở rộng, nhưng cách thực hiện khác nhau hoàn toàn giữa các lần triển khai. Chẳng hạn, giải pháp do Costas đưa ra sử dụng cú pháp dành riêng cho GNU date. Nếu bạn muốn tính di động, sử dụng perl.
Stéphane Chazelas 17/8/2016

4

Nếu bạn thích, awkbạn có thể sử dụng lệnh bên ngoài datevới bất kỳ định dạng ngày nào

awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'

+1 cho KHÔNG sử dụng strftime()!

4
Lưu ý rằng việc sử dụng lệnh bên ngoài sẽ gây ra một cú đánh hiệu suất nghiêm trọng, đặc biệt đáng chú ý nếu có hàng ngàn hàng đang được xử lý
Jose Gómez

2

Bạn cũng có thể thử:

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

2

Tôi đã hỏi một câu hỏi 9 tháng trước được đánh dấu là bản sao của câu hỏi này. Tôi chỉ mới thấy một yêu cầu để gửi câu trả lời phù hợp với tôi về câu hỏi này. Đây là một liên kết đến câu hỏi và câu trả lời.

/unix//a/304009/172916

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.