मैं किसी कॉलम में टाइमस्टैम्प को डेट में कैसे बदल सकता हूं?


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यहाँ देता है। कृपया स्पष्ट करें कि हर किसी के पास नहीं है strftime()! अधिकांश (सभी?) AWK में चलने वाले समाधान के लिए, कृपया dateपोर्टेबल रहने के लिए बाहरी कमांड का उपयोग करें ।

2
@yeti, कुछ dateकार्यान्वयन हैं जो प्रारूपों के बीच तारीखों को विस्तार के रूप में परिवर्तित कर सकते हैं, लेकिन यह कैसे किया जाता है यह पूरी तरह से कार्यान्वयन के बीच भिन्न होता है। उदाहरण के लिए, कोस्टास द्वारा दिया गया समाधान GNU के लिए एक सिंटैक्स विशिष्ट का उपयोग करता है date। यदि आप पोर्टेबिलिटी चाहते हैं, तो उपयोग करें perl
स्टीफन चेजेलस

4

यदि आप चाहें awkतो dateकिसी भी तारीख प्रारूपों के साथ बाहरी कमांड का उपयोग कर सकते हैं

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

+1 का उपयोग नहीं करने के लिए strftime()!

4
ध्यान दें कि एक बाहरी कमांड का उपयोग करने से एक गंभीर प्रदर्शन प्रभावित होगा, विशेष रूप से ध्यान देने योग्य यदि कई हजारों पंक्तियों को संसाधित किया जा रहा है
जोस गोमेज़

2

आप भी आजमा सकते हैं:

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

2

मैंने 9 महीने पहले एक प्रश्न पूछा था जो इस एक के डुप्लिकेट के रूप में चिह्नित किया गया था। मैंने केवल अब इस प्रश्न पर मेरे लिए काम करने वाले उत्तर को पोस्ट करने का अनुरोध देखा। यहाँ उस प्रश्न और उत्तर की एक कड़ी है।

/unix//a/304009/172916

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.