ฉันจะแปลงการประทับเวลาในคอลัมน์เป็นวันที่ได้อย่างไร


15

ฉันมีไฟล์ที่มีสิ่งนี้:

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

ฉันต้องการแปลงเวลาเป็นวันที่ในรูปแบบนี้:

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

ฉันจะทำสิ่งนั้นได้อย่างไร

ฉันรู้ว่างานนี้: perl -pe 's/(\d+)/localtime($1)/e'(จากคำถามนี้ ) Mon Nov 10 02:00:03 2014แต่รูปแบบออกเป็น

ฉันรู้ว่าคำสั่งนี้สามารถแปลงการประทับเวลาเป็นผลลัพธ์ที่ต้องการ: date -d@1415602803 +"%F %H:%M:%S"แต่ฉันไม่สามารถawkใช้งานได้system("cmd")เนื่องจากการใช้ใบเสนอราคาและอะไรก็ตาม

คำตอบ:



17

สิ่งที่พบได้ที่นี่: Stackoverflow - แปลงจาก unixtime ที่บรรทัดคำสั่ง

มากับสิ่งนี้:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","ที่จะใช้ตัวคั่นเขตของ,,
  • OFS=",";เพื่อให้ฟิลด์เอาต์พุตถูกคั่นด้วย,,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);เพื่อเปลี่ยนค่าของเขตข้อมูลแรก$1เป็นรูปแบบที่ระบุและ
  • print $0; เพื่อพิมพ์ทั้งบรรทัด

2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'ให้awk: line 2: function strftime never definedที่นี่ โปรดอธิบายว่าไม่มี AWK ทุกคนstrftime()! สำหรับโซลูชันที่ทำงานใน AWK ส่วนใหญ่ (ทั้งหมดหรือไม่) โปรดใช้dateคำสั่งภายนอกเพื่อคงความสะดวกในการพกพา

2
@ ใช่มีการdateใช้งานไม่กี่อย่างที่สามารถแปลงวันที่ระหว่างรูปแบบเป็นส่วนขยายได้ ยกตัวอย่างเช่นการแก้ปัญหาที่กำหนดโดย Costas ใช้เฉพาะไวยากรณ์ dateGNU perlหากคุณต้องการพกพาใช้งาน
Stéphane Chazelas

4

ถ้าคุณชอบawkคุณสามารถใช้คำสั่งภายนอกdateกับรูปแบบวันที่ใด ๆ

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

+1 สำหรับไม่ใช้strftime()!

4
โปรดทราบว่าการใช้คำสั่งภายนอกจะทำให้เกิดการทำงานที่รุนแรงโดยเฉพาะอย่างยิ่งหากมีการประมวลผลหลายพันแถว
Jose Gómez


2

ฉันถามคำถามเมื่อ 9 เดือนที่แล้วว่าถูกทำซ้ำกับคำถามนี้ ฉันเพิ่งเห็นคำขอให้โพสต์คำตอบที่เหมาะกับฉันในคำถามนี้ นี่คือลิงค์ไปยังคำถามและคำตอบ

/unix//a/304009/172916

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.