CSV 文件的数字舍入,跳过标题

CSV 文件的数字舍入,跳过标题

这个问题是这个问题的衍生问题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

PerlVar:与文件句柄相关的变量


其他工具具有显式标头处理例如。来自numfmtGNU 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会导致输出所有行,无论是否修改。

相关内容