Perl

CSV 文件的捨入數字,跳過標題

  • April 9, 2021

這個問題是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 文件的第一行或第一行?

Perl 有一個特殊的變數$.來記錄目前的行號。$. > 1因此,您可以為替換添加一個簡單的條件:

perl -i -pe 's/(\d*\.\d*)/int($1+0.5)/ge if $. > 1' file

請參閱PerlVar:與文件句柄相關的變數


其他工具具有明確的標頭處理 ex。來自numfmtGNU Coreutils:

numfmt -d, --header --format='%.0f' --field=- --invalid=ignore <file

(預設情況下,四捨五入是 IEEE 從零開始)。

假設您要在輸出中保留標頭:

$ 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導致輸出所有行,無論是否修改。

引用自:https://unix.stackexchange.com/questions/610707