2010-01-23 13 views
15

Mam plik zawierający wiele kolumn tekstu, w tym znacznik czasu zgodny z Fri Jan 02 18:23 i muszę przekonwertować tę datę na format MM/DD/YYYY HH:MM.Konwersja dat w AWK

Próbowałem użyć standardowego narzędzia "date" z awk getline, aby wykonać konwersję, ale nie jestem w stanie wymyślić, jak przekazać pola do polecenia "date" w oczekiwanym formacie (cytowane z "lub„s) jak getline potrzebuje ciąg poleceń w cudzysłowach też.

Coś "date -d '$1 $2 $3 $4' +'%D %H:%M'" | getline var

teraz, gdy o tym myślę, myślę, co mi naprawdę pytaniem jest to, jak osadzić zmiennych awk na ciąg znaków:

Odpowiedz

17

możesz to wypróbować Zakładając, że podana data jest w pliku

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

wyjście

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

a jeśli nie są przy użyciu narzędzi GNU, jak jeśli jesteś w Solaris na przykład użyć 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

Opierając się na niestandardowej flagi "date", a następnie potok nie jest nawet tak uzasadniony, jak wywołanie wbudowanego skryptu Perla do wykonania pracy. – gary

+0

@gary: nieco trudne. Jeśli ma narzędzia gnu, dlaczego nie skorzystać z ich możliwości? –

+0

@glenn: Może ghostdog ma gnu, ale OP pytał o awk. I zamiast wykonywania polecenia zewnętrznego (daty) dla każdej linii, naprawdę powinien pomyśleć więcej. – gary

18

Jeśli używasz gawk, ty nie potrzebujesz zewnętrznego date, który może być expensive, aby wielokrotnie dzwonić:

Dzięki ghostdog74 dla tablicy miesięcy od this answer.

+1

+1 za umożliwienie awk wykonania całej pracy. Wymaga gawk dla 'strftime()' –

+0

"Jeśli używasz gawk ...". Dzięki za +1. –