2015-01-04 76 views
1

這個awk腳本使用系統調用將秒轉換爲時間碼。爲什麼不使用內置函數呢?出於便攜性的原因。這需要在OS X Mavericks(GNU bash,版本3.2.53,awk版本20070501)上工作,對此,內置的strftime函數不可用(據我所知)。爲什麼awk在系統調用後返回一個額外的行和「0」?

cat file 
A 3000 
B 3010 
C 3020 

我的腳本:

awk '{ printf "%s %s\n", system("date -r " $2 " -j +%H:%M:%S"), $1 }' file 

返回此

01:50:00 
0 A 
01:50:10 
0 B 
01:50:20 
0 C 

,而我試圖在同一行上打印的第一條記錄的值作爲像這樣的時間碼:

01:50:00 A 
01:50:10 B 
01:50:20 C 

我在做什麼錯?

+0

如果'awk'不要所有版本有你需要的功能,也許你應該改用Perl或Python(或類似的東西)。 –

回答

1

你可以使用date命令打印的$1你的文字值是這樣的:

awk '{ system("/bin/date -r " $2 " -j \"+%H:%M:%S " $1 "\"") }' file 
19:50:00 A 
19:50:10 B 
19:50:20 C 

或者在AWK使用getline

awk '{ cmd = "/bin/date -r " $2 " -j +%H:%M:%S"; 
     if (cmd | getline var) printf "%s %s\n", d, $1; close (cmd) }' file 
19:50:00 A 
19:50:10 B 
19:50:20 C 
+0

我已經在使用'date'。您的解決方案將該字段移入系統調用。它有效,但我寧願將它保留在外面,因爲劇本將會演變並變得更加複雜。任何替代的想法? – user2243670

+0

是的另一個想法已經在使用getline的答案:) – anubhava

+1

@ user2243670 Getline是最好的選擇。雖然printf仍然不需要使用'print d,$ 1'。 –

相關問題