我有一列如下:
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)
您可以首先检查该列是否包含数字(通过正则表达式),然后相应地处理打印:
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)