如何在awk中同时格式化字符串和浮点数?

Kay*_*Kay 1 format shell awk

我有一列如下:

ifile.txt
1.25
2.78
?
?
5.6
3.4
Run Code Online (Sandbox Code Playgroud)

我想将浮点格式化为十进制并按原样跳过字符串。

ofile.txt
1
3
?
?
6
3
Run Code Online (Sandbox Code Playgroud)

Walter A、F. Knorr 和 Janez Kuhar 根据我的问题和需要像

awk '{printf "%d%s\n", $1}' ifile.txt
Run Code Online (Sandbox Code Playgroud)

同样,我发现我有很多列,但是,其他列不需要任何格式。所以我必须以类似的形式使用上述命令:

awk '{printf "%5s %d%s %5s %5s %5s\n", $1, $2, $3, $4, $5}' ifile.txt
Run Code Online (Sandbox Code Playgroud)

例如:

ifile.txt
1  1.25   23.2    34  3.4
2  2.78   22.0    23  1.2
3     ?      ?     ?  4.3
4     ?      ?     ?  6.5
5   5.6   45.0     5  2.4
6   3.4   43.0    23  5.6
Run Code Online (Sandbox Code Playgroud)

我使用了 F. Knorr 在回答中再次建议的以下命令,

awk '$2~/^[0-9]+\.?[0-9]*$/{$2=int($2+0.5)}1' ifile.txt > ofile.txt

ofile.txt
1  1 23.2    34  3.4
2  3 22.0    23  1.2
3  ?      ?     ?  4.3
4  ?      ?     ?  6.5
5  6 45.0     5  2.4
6  3 43.0    23  5.6
Run Code Online (Sandbox Code Playgroud)

它工作正常,但需要对其进行格式化。喜欢

ofile.txt
1  1   23.2    34  3.4
2  3   22.0    23  1.2
3  ?      ?     ?  4.3
4  ?      ?     ?  6.5
5  6   45.0     5  2.4
6  3   43.0    23  5.6
Run Code Online (Sandbox Code Playgroud)

F. *_*orr 5

您可以首先检查该列是否包含数字(通过正则表达式),然后相应地处理打印:

 awk '$1~/^[0-9]+\.?[0-9]*$/{printf "%i\n",$1+0.5; next}1' test.txt
Run Code Online (Sandbox Code Playgroud)

更新:如果是第 n 列需要按上述方式进行格式化(并且其他列中没有其他格式化),则在以下命令中全部替换$1$n

awk '$1~/^[0-9]+\.?[0-9]*$/{$1=int($1+0.5)}1' test.txt
Run Code Online (Sandbox Code Playgroud)