2010-01-23 33 views
15

Tôi có tệp chứa nhiều cột văn bản, bao gồm dấu thời gian dọc theo các dòng Fri Jan 02 18:23 và tôi cần chuyển đổi ngày đó thành định dạng MM/DD/YYYY HH:MM.Chuyển đổi ngày trong AWK

Tôi đã cố gắng sử dụng công cụ `date 'chuẩn với đường chuẩn awk để thực hiện chuyển đổi, nhưng tôi không thể tìm ra cách truyền các trường vào lệnh' date 'theo định dạng mong muốn (được trích dẫn với "hay 's,) như getline cần chuỗi lệnh kèm theo trong dấu ngoặc kép quá.

Something như "date -d '$1 $2 $3 $4' +'%D %H:%M'" | getline var

Bây giờ tôi nghĩ về nó, tôi đoán những gì tôi đang thực sự hỏi là làm thế nào để nhúng biến awk thành một chuỗi.

Trả lời

17

bạn có thể thử điều này. Giả sử chỉ ngày bạn đã chỉ định có trong tệp

awk ' 
{ 
    cmd ="date \"+%m/%d/%Y %H:%M\" -d \""$1" "$2" "$3" "$4"\"" 
    cmd | getline var 
    print var 
    close(cmd) 
}' file 

đầu ra

$ ./shell.sh 
01/02/2010 18:23 

và nếu bạn không sử dụng công cụ GNU, giống như nếu bạn đang ở trong Solaris ví dụ, sử dụng nawk

nawk 'BEGIN{ 
    m=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",d,"|") 
    for(o=1;o<=m;o++){ 
     months[d[o]]=sprintf("%02d",o) 
    } 
    cmd="date +%Y" 
    cmd|getline yr 
    close(cmd) 
} 
{ 
    day=$3 
    mth=months[$2] 
    print mth"/"day"/"yr" "$4 
} ' file 
+0

Dựa vào cờ 'ngày' không chuẩn và sau đó một đường ống thậm chí không hợp pháp như gọi một đoạn mã Perl nội tuyến để thực hiện công việc. – gary

+0

@gary: hơi khắc nghiệt. Nếu anh ta có công cụ gnu, tại sao không sử dụng khả năng của họ? –

+0

@glenn: Có thể ghostdog có gnu, nhưng OP đã hỏi về awk. Và thay vì thực hiện một lệnh bên ngoài (ngày) cho mỗi dòng, anh ta thực sự nên nghĩ nhiều hơn. – gary

18

Nếu bạn đang sử dụng gawk, bạn không cần bên ngoài date có thể là expensive để gọi liên tục:

awk ' 
BEGIN{ 
    m=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",d,"|") 
    for(o=1;o<=m;o++){ 
     months[d[o]]=sprintf("%02d",o) 
    } 
format = "%m/%d/%Y %H:%M" 
} 
{ 
split($4,time,":") 
date = (strftime("%Y") " " months[$2] " " $3 " " time[1] " " time[2] " 0") 
print strftime(format, mktime(date)) 
}' 

Nhờ ghostdog74 cho mảng tháng từ this answer.

+1

+1 để cho phép làm tất cả công việc. Yêu cầu gawk cho 'strftime()' –

+0

"Nếu bạn đang sử dụng gawk ...". Cảm ơn vì +1. –

Các vấn đề liên quan