月番号を月名に変更し、同じ月の行に対して一度印刷します。

月番号を月名に変更し、同じ月の行に対して一度印刷します。

私はawkプログラミングの初心者です。次のように説明したいと思います。

私は持っています:

month D1 D2 D3
01    25 26 23
01    13 12 11
01    48 45 12
02    77 87 45
02    63 99 12

私が欲しい:

month D1 D2 D3
January 25 26 23
        13 12 11
        48 45 12
February 77 87 45
         63 99 12

ベストアンサー1

zsh(ユーザーロケールの月名リストを取得する)+を使用してくださいawk。おそらく次のようになります。

zmodload zsh/langinfo
awk -v months=${(vj[:])langinfo[(I)MON_<1-12>]} '
  BEGIN{split(months, month, ":")}
  NR > 1 {
    this_month = month[0+$1]
    if (this_month == last)
      $1 = blanks
    else
      blanks = sprintf("%*s", length(last = $1 = this_month), "")
  }
  {print}' < your-file

月名に複数バイトでエンコードされた文字を含むロケール(たとえば、février2バイトでエンコードされたロケール)では、fr_FR.UTF-8マルチバイトをサポートしない実装ではソートがオフになるé可能性があります。awkmawk

たとえば、次のような結果が得られます。

month D1 D2 D3
janvier 25 26 23
        13 12 11
        48 45 12
février 77 87 45
        63 99 12

gawk、しかし

month D1 D2 D3
janvier 25 26 23
        13 12 11
        48 45 12
février 77 87 45
         63 99 12

そしてmawk

ユーザーのロケールに関係なく、月名を英語で表示したい場合に設定できますLC_ALL=C

おすすめ記事