2013-07-17 1 views
-1

Файл 1изменить дату месяца в числовом формате в AWK

P1,06/Jul/2013,09/Jul/2013 
P2,06/Jul/2013,10/Jul/2013 
P3,06/Jul/2013,15/Jul/2013 

Ouput я хочу, как это:

P1,06/07/2013,09/07/2013,3days 
P2,06/07/2013,10/07/2013,4days 
P3,06/07/2013,15/07/2013,9days 

ктото помощь нужна для этого, пожалуйста,

+0

ли вы узнать что-нибудь о хороших ответах [здесь] (http://stackoverflow.com/questions/17670093/вычислить-финиковой разница-между-2-3-из-файла-в-AWK)? Покажи это нам. – Birei

+0

@Birei, я только что заметил ваш комментарий и проверил ссылки, где нашел ответ, с которым я пошел, похож на GlennJackman's. Он указывает, что я должен написать некоторые чистые функции awk. – n0741337

ответ

1

Этот ответ в значительной степени зависит от формата даты BSD, доступного на mac

#!/usr/bin/awk -f 

BEGIN { FS=" " } 

{ 
    split($0, arr, ",") 
    ts1 = date2ts(arr[ 2 ]) 
    ts2 = date2ts(arr[ 3 ]) 
    days = (ts2-ts1)/86400 
    date1 = ts2date(ts1) 
    date2 = ts2date(ts2) 
    printf("%s,%s,%s,%d days\n", arr[ 1 ], date1, date2, days) 
} 

function runCmd(cmd) { 
    cmd | getline output 
    close(cmd) 
    gsub("\"", "", output) 
    return output 
} 

function date2ts(date) { 
    return runCmd(sprintf(\ 
     "date -j -f\\\"%%d/%%b/%%Y\\\" \\\"%s\\\" +\\\"%%s\\\"", date)) 
} 

function ts2date(ts) { 
    return runCmd(sprintf(\ 
     "date -j -f\\\"%%s\\\" \\\"%s\\\" +\\\"%%d/%%m/%%Y\\\"", ts)) 
} 

я получаю следующий результат:

P1,06/07/2013,09/07/2013,3days 
P2,06/07/2013,10/07/2013,4days 
P3,06/07/2013,15/07/2013,9days 
0

Попробуйте это другое awk решения.

#!/usr/bin/awk 
BEGIN { 
     FS=","; 
} 
{ 
     epoch_date_format($2)|getline d1       
     epoch_date_format($3)|getline d2 
     days=(d2-d1)/3600/24; 
     month_format(d1)|getline sd1 
     month_format(d2)|getline sd2 
     print $1","sd1","sd2","days"days" 
} 
function epoch_date_format(string) { 
     split(string,array,"/"); 
     return "date -d\""array[1]"-"array[2]"-"array[3]"\" +%s"; 
} 
function month_format(epoch) { 
     return "date [email protected]"epoch" +%d/%m/%Y" 
} 

Выход:

P1,06/07/2013,09/07/2013,3days 
P2,06/07/2013,10/07/2013,4days 
P3,06/07/2013,15/07/2013,9days 
0

С GNU AWK:

awk -F'[,/]' -v OFS=',' ' 
function date2secs(fld) { 
    return mktime($(fld+1)" "(match("JanFebMarAprMayJunJulAugSepOctNovDec",$fld)+2)/3" "$(fld-1)" 0 0 0") 
} 
{ 
    start= date2secs(3) 
    end = date2secs(6) 
    diff = int((end-start)/(60*60*24)) 
    print $1,strftime("%d/%m/%Y",start),strftime("%d/%m/%Y",end),diff"days" 
} 
' file 
P1,06/07/2013,09/07/2013,3days 
P2,06/07/2013,10/07/2013,4days 
P3,06/07/2013,15/07/2013,9days 
Смежные вопросы