手動書式設定を備えたロケール独立ソリューション

手動書式設定を備えたロケール独立ソリューション

誰でもawkコマンドを使用して、「数字には3桁ごとにカンマが含まれています。

この出力を得るためにsedコマンドを使用する方法を知っていますが、awkを使用する方法がわかりません。私は初心者です。朝から検索を始めましたが、適切な回答が得られなかったと教えてください。最高のチュートリアルを提案してください。学ぶ。

sed コマンドは上記の出力を取得します。

echo "100000000" | sed -E 's/([0-9]{3})/,\1/2g'

答え1

手動書式設定を備えたロケール独立ソリューション

これは、インストールされているロケールに関係なく、すべてのPOSIX準拠のオペレーティングシステムで機能します。

$ printf "1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n" \
| awk '{ len=length($0); res=""; for (i=0;i<=len;i++) { res=substr($0,len-i+1,1) res; if (i > 0 && i < len && i % 3 == 0) { res = "," res } }; print res }'
1
10
100
1,000
10,000
100,000
1,000,000
10,000,000
100,000,000

printfen_US ロケールを使用するソリューションです。

このprintfシーケンスは、%'d現在のロケールに対して千単位の区切り文字を使用して、フォーマットされた10進数を印刷します。

$ printf "1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n" \
| LC_ALL=en_US.UTF-8 awk '{ printf("%'"'"'d\n", $0) }'
1
10
100
1,000
10,000
100,000
1,000,000
10,000,000
100,000,000

答え2

gawk 'END {
        printf("%-20s %\47 10i \n",  "Number of records: ", NR)
        printf("%-20s %\47 10.2f \n",  "Number of records: ", NR)
    }' /var/log/kern.log

Number of records:        2,818
Number of records:     2,818.00 `

答え3

もう一つの解決策はnumfmt(Debianの一部であり、デフォルトではcoreutilsDebianに含まれています)

$ printf "1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n" \
| LC_ALL=en_US.UTF-8 numfmt --padding=12 --grouping
           1
          10
         100
       1,000
      10,000
     100,000
   1,000,000
  10,000,000
 100,000,000
$ printf "1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n" \
| LC_ALL=en_US.UTF-8 numfmt --grouping
1
10
100
1,000
10,000
100,000
1,000,000
10,000,000
100,000,000

%'f以下を使用して値の書式を直接指定することもできます。--grouping

$ printf "1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n" \
| LC_ALL=en_US.UTF-8 numfmt --format "%'f"
$ printf "1\n10\n100\n1000\n10000\n100000\n1000000\n10000000\n100000000\n" \
| LC_ALL=en_US.UTF-8 numfmt --format "%'12f"

関連情報