2013-03-20 20 views
0

我有以下文件,其中值爲數字時要填充零,但將值保留爲當值爲字符串:如何使用awk和printf設置數值爲數字或字符串時的列格式

cat test.txt 
2032 
12 
XXXXX 
507 
334 

這僅適用於數值,字符串被忽略:

awk '{printf "%05d\n",$1}' test.txt 
02032 
00012 
00000 
00507 
00334 

我可以用一個條件得到它,但有一個更簡單的方法?

awk '{if ($1 ~ /^[0-9]+$/) printf "%05d\n",$1; else printf "%s\n",$1}' test.txt 
02032 
00012 
XXXXX 
00507 
00334 
+0

「數字」在你的上下文中意味着什麼?例如,如果「2.3」,「.5」,「NaN」,「Inf」,「1e3」中的任何一個是數字? – 2013-03-20 19:12:27

+0

在這裏,數字將是整數。 – 2013-03-21 15:36:19

回答

4

我想你的awk解決方案是可以的。如果你的 「簡單」 是指 「」:

awk '$0*1==$0{$0=sprintf("%05d",$0)}1' file 

awk '/^[0-9]+$/{$0=sprintf("%05d",$0)}1' file 

awk '$0*1==$0{printf("%05d\n",$0);next}1' file 

,或者如果你確信沒有空行的文件:

awk '$0=$0*1==$0?sprintf("%05d",$0):$0' file 

在上面的例子中,我使用了$ 0而不是$ 1,因爲在您的輸入示例中,只有一列。

+0

非常感謝解決方案。在我的'真實'文件中,有幾列有這種潛在的雙格式,這就是爲什麼我想要比上面的if條件更好的解決方案。 – 2013-03-20 15:35:00

+0

在您的前3個解決方案結束時,1表示什麼? – 2013-03-20 15:38:10

+1

@SébastienClément'1'是一個布爾表達式,意思是'true'。如果爲真,awk將打印$ 0。你可以試試'seq 10 | awk'$ 0%2''然後你就會明白了。 – Kent 2013-03-20 15:42:23

相關問題