この質問はこの質問の派生です。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
他のツールには明示的なヘッダ処理機能があります。numfmt
GNU 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
すべての行が出力されたり変更されたりすることはありません。