2012-07-16 60 views
0

我試圖計算awk中開始和結束日期的持續時間。這裏是我的功能awk中日期轉換的奇怪行爲

function computeDuration(start, end) { 
    sub(/T/, " ", start); 
    sub(/T/, " ", end); 
    print start; 
    print end; 
    cmd="date --date=\"$start\" +%s"; 
    cmd | getline startDate; 
    cmd="date --date=\"$end\" +%s"; 
    cmd | getline endDate; 
    print startDate; 
    print endDate; 
    return endDate-startDate; 
} 

我的輸出:

2012-7-16 13:20 
2012-7-16 13:30 
1342389600 
1342389600 

任何人都可以解釋它是如何可能的是兩個不同的日期會導致同樣的結果+%s

回答

2

這是錯誤的cmd變量。

awk 'function computeDuration(start, end) { 
print start; 
print end; 
cmd="date --date=\"start\" +%s";print cmd; 
cmd | getline startDate; 
cmd="date --date=\"end\" +%s";print cmd; 
cmd | getline endDate; 
print startDate; 
print endDate; 
return endDate-startDate; 
} BEGIN {computeDuration("2012-7-16 13:20","2012-7-16 13:30")}' 

OUTPUT: 
2012-7-16 13:20 
2012-7-16 13:30 
date --date="$start" +%s 
date --date="$end" +%s 
1342389600 
1342389600 

$符號不應該在那裏,你需要周圍的變量

awk 'function computeDuration(start, end) { 
print start; 
print end; 
cmd="date --date=\""start"\" +%s";print cmd; 
cmd | getline startDate; 
cmd="date --date=\""end"\" +%s";print cmd; 
cmd | getline endDate; 
print startDate; 
print endDate; 
return endDate-startDate; 
} BEGIN {print computeDuration("2012-7-16 13:20","2012-7-16 13:30")}' 

OUTPUT: 
2012-7-16 13:20 
2012-7-16 13:30 
date --date="2012-7-16 13:20" +%s 
date --date="2012-7-16 13:30" +%s 
1342437600 
1342438200 
+0

你引用我的代碼時,會丟失美元的額外引號,但儘管如此,你是完全正確的!謝謝! – 2012-07-16 14:30:05

+0

@AdamPierzchała,:)他們不得不去或代碼失敗。比富有更好?那就是如果你正在瞄準那些在CMD行中的人。如果不是......那不是故意的。樂於幫助。 – 2012-07-16 14:40:47

+0

「情況標記」是否與引號相同? – 2012-07-17 02:52:58