特定のフィールドの数に小数点区切り文字を追加する方法

特定のフィールドの数に小数点区切り文字を追加する方法

.txtファイルがあり、読みやすくするために、小数点区切り文字でカンマを追加する必要があります。この長い数字は特定の列にのみ存在し、これを行う方法を見つけることができません。列はセミコロンで区切られ、任意の文字を含めることができます。私はawkでifステートメントを使用して列の長さが3より大きいことを確認しようとしましたが、3つの数字ごとにカンマを入れる方法が見つかりませんでした。数字は3番目と4番目の列にあります。

これ

BitstreamCyberCJK;Freeware;30275;28686;v2.0 beta (1998-03-17);Cyberbit.ttf (12.4 MB);Bitstream CyberCJK;Medium (Normal), Book, Roman;TTF;Cove

Y.OzFontN;Freeware;21957;57621;v13.00 sfnt rev 5 Pen-Ji (2010-08-24);YOzRN.TTC (13.5 MB);YOzFontN;Regular;TTC;Any

次のようにする必要があります。

BitstreamCyberCJK;Freeware;30,275;28,686;v2.0 beta (1998-03-17);Cyberbit.ttf (12.4 MB);Bitstream CyberCJK;Medium (Normal), Book, Roman;TTF;Cove

Y.OzFontN;Freeware;21,957;57,621;v13.00 sfnt rev 5 Pen-Ji (2010-08-24);YOzRN.TTC (13.5 MB);YOzFontN;Regular;TTC;Any

ベストアンサー1

GNU Coreutilsを使用していて、numfmtロケールがこれらのグループ化をサポートしている場合は、次のものを使用できます。

numfmt -d ';' --field=- --grouping --invalid='ignore' < file

前任者。

$ numfmt -d ';' --field=- --grouping --invalid='ignore' < file
BitstreamCyberCJK;Freeware;30,275;28,686;v2.0 beta (1998-03-17);Cyberbit.ttf (12.4 MB);Bitstream CyberCJK;Medium (Normal), Book, Roman;TTF;Cove

Y.OzFontN;Freeware;21,957;57,621;v13.00 sfnt rev 5 Pen-Ji (2010-08-24);YOzRN.TTC (13.5 MB);YOzFontN;Regular;TTC;Any

どのフィールドに数値フィールドが含まれているかを知っている場合は、そのフィールドを明示的に指定して処理を省略できます--invalid

numfmt -d ';' --field=3,4 --grouping < file

%'GNU awkがある場合は、フォーマット修飾子を使用して次の操作を実行できますsprintf

gawk '
  BEGIN {OFS=FS=";"} 
  {for(i=1;i<NF;i++) {if($i ~ /^[0-9]+$/) $i = sprintf("%'\''d", $i)}} 
  1
' file

おすすめ記事