String 当值为数字或字符串时,如何使用awk和printf格式化列

String 当值为数字或字符串时,如何使用awk和printf格式化列,string,awk,formatting,printf,numeric,String,Awk,Formatting,Printf,Numeric,我有以下文件,当值为数字时,我希望在其中保留零填充,但当值为字符串时,保留原样: 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

我有以下文件,当值为数字时,我希望在其中保留零填充,但当值为字符串时,保留原样:

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

我认为你的awk解决方案还可以。如果您的“更简单””表示“更短””:

或者,如果您确定文件中没有空行:

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

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

我认为您的awk解决方案还可以。如果您的“更简单””表示“更短””:

或者,如果您确定文件中没有空行:

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

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

非常感谢您提供的解决方案。在我的“real”文件中,有几个列具有这种潜在的双重格式,这就是为什么我想要一个比上面的if条件更好的解决方案。在前3个解决方案的末尾,1是什么意思?@sébasience
1
是一个布尔表达式,表示
true
。如果为真,awk将打印$0。您可以尝试
seq 10 | awk'$0%2'
然后您就会明白。非常感谢您提供的解决方案。在我的“real”文件中,有几个列具有这种潜在的双重格式,这就是为什么我想要一个比上面的if条件更好的解决方案。在前3个解决方案的末尾,1是什么意思?@sébasience
1
是一个布尔表达式,表示
true
。如果为真,awk将打印$0。您可以尝试
seq 10 | awk'$0%2'
然后您就会明白。在您的上下文中,“数值”是什么意思?例如,如果“2.3”、“0.5”、“NaN”、“Inf”、“1e3”中的任何一个是数字,那么哪个是数字?在这里,数字应该是整数。“数字”在您的上下文中是什么意思?例如,如果“2.3”、“0.5”、“NaN”、“Inf”、“1e3”中的任何一个是数字,那么哪个是数字?在这里,数字应该是整数。
awk '$0*1==$0{printf("%05d\n",$0);next}1' file
awk '$0=$0*1==$0?sprintf("%05d",$0):$0' file