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のオネライナーによって修正されることです。これは私にとって非常に不便です。このワンライナーで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は0から切り上げられます。)

答え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 one-liner と同じ方法でデータの数値形式を再指定するために使用されますが、最初の行は触れません。

最初の行を除いて、入力された行ごとに数値が丸められ、変更されたデータでその行が書き換えられます。コードを末尾にすると、1すべての行が出力されたり変更されたりすることはありません。

関連情報