这个问题是这个问题的衍生问题https://askubuntu.com/questions/601149/is-there-a-command-to-round-decimal-numbers-in-txt-files,通过使用以下方法成功解决了:
perl -i -pe 's/(\d*\.\d*)/int($1+0.5)/ge' file
问题是,我的CSV文件的头部也被上面的perl的oneliner修改了,这对我来说很不方便。有什么方法可以跳过此 oneliner 中 CSV 文件的第一行或第一行吗?
答案1
Perl 有一个特殊的变量$.
来跟踪当前行号。因此,您可以$. > 1
在替换中添加一个简单的条件:
perl -i -pe 's/(\d*\.\d*)/int($1+0.5)/ge if $. > 1' file
其他工具具有显式标头处理例如。来自numfmt
GNU Coreutils 的:
numfmt -d, --header --format='%.0f' --field=- --invalid=ignore <file
(默认情况下,IEEE 从零舍入)。
答案2
假设您想在输出中保留标头:
$ cat file
number
0.1
1.2
3.8
$ awk 'NR > 1 { $0 = sprintf("%d", $0 + 0.5) }; 1' file
number
0
1
4
这用于awk
以与 Perl 单行代码相同的方式重新格式化数据中的数字,但不触及第一行。
对于输入的每一行,除了第一行之外,数字都会四舍五入,并用修改后的数据重写该行。代码中的尾随1
会导致输出所有行,无论是否修改。