月名で示された日付を数値月名に変換するには?

月名で示された日付を数値月名に変換するには?

dateMacOSを使用し、フォーマットに変数があります。

3.Jan.2023,
12.Nov.2017,
9.Apr.2022,
...

私は少し変えなければなりません。

03.01.2023,
12.11.2017,
09.04.2022,
...

答え1

アップルシステムdate変換の入出力形式を指定できます。

for inp in "3.Jan.2023" "12.Nov.2017" "9.Apr.2022"; do
    date -j -f "%d.%b.%Y" "$inp" "+%d.%m.%Y"
done

~によるとstrptime():

  • %b月、ロケールの月名を使用して、略語またはフルネームを指定できます。
  • %d日付[01,31]。前にゼロが許可されますが、必須ではありません。
  • %m月番号[01,12];前にゼロが許可されますが、必須ではありません。
  • %Y世紀を含む年(例:1988)。

出力:

03.01.2023
12.11.2017
09.04.2022

答え2

awkを使用してください。

$ awk '
    BEGIN { FS=OFS="," }
    {
        split($1,d,".")
        $1 = sprintf("%02d.%02d.%04d", d[1], index("  JanFebMarAprMayJunJulAugSepOctNovDec",d[2])/3, d[3])
        print
    }
' file
03.01.2023,
12.11.2017,
09.04.2022,

正面に2つのスペースがありますJan

答え3

awk以下を使用して、ある形式から別の形式に変換できます。

awk -F. '
    BEGIN { m["Jan"]=1; m["Feb"]=2; m["Mar"]=3; m["Dec"]=12 }
    { printf "%02d.%02d.%04d,\n", $1, m[$2], $3 }
' file

すべての月のパターンに従うには、行をBEGIN完成する必要があります。

答え4

使用幸せ(以前のPerl_6)

~$ raku -pe 'my %months = [Z=>] <Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec>, 1..12; \ 
             s/ <( (\d**1..2) \. (<alpha>**3) )> \. \d**4 \, /{sprintf q[%02d.%02d], $0, %months{$1}}/;'  file 

#OR

~$ raku -pe 'my %months = [Z=>] <Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec>, 1..12; \ 
             s[ <( (\d**1..2) \. (<alpha>**3) )> \. \d**4 \, ] = "{sprintf q[%02d.%02d], $0, %months{$1}}";'  file

または:

~$ raku -e 'my %months = [Z=>] <Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec>, 1..12; \
            put S/ <( (\d**1..2) \. (<alpha>**3) )> \. \d**4 \, /{sprintf q[%02d.%02d], $0, %months{$1} }/ for lines();' file

#OR

~$ raku -e 'my %months = [Z=>] <Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec>, 1..12; \
            put S[ <( (\d**1..2) \. (<alpha>**3) )> \. \d**4 \, ] = "{sprintf q[%02d.%02d], $0, %months{$1} }" for lines();'  file

つまり、Rakuを使用して文字列の月を置き換え、数値(整数)で置き換えることができます。 (を使用して)日数の形式を指定することもできますsprintf%months3桁の月名をキーとしてハッシュを宣言し、数値を1..12値として割り当てます。折りたたみ[Z=>]メタ演算子は、与えられた2つのリストから連続要素を取得しますkey => value。結果はsay %months.sort(*.value);次を返します。

(Jan => 1 Feb => 2 Mar => 3 Apr => 4 May => 5 Jun => 6 Jul => 7 Aug => 8 Sep => 9 Oct => 10 Nov => 11 Dec => 12)

ハッシュがある場合は、%months単にs///交換(またはS///場合によっては交換)されます。最初の2つのコード例では、-peautoprintフラグが使用されました。左半分の一致はs///すべての要素を識別しますが<(...)> 「キャプチャマーク」日付と文字列月のみをキャプチャするようにすべてを外部に配置します(日付はに入力し、$0月はに入力$1)。演算子の右半分では、s///ハッシュ%months値は$1以下のように変数キーに入力されます。%months{$1}これはハッシュ値がキーを返すように指示しますvalue。出力には日と月の両方が使用されますsprintf

3番目と4番目のコード例は、%monthsハッシュ値が一度だけ宣言されることを除いて、最初のコード例と似ています。-peまたは、-neコマンドラインフラグを使用する代わりに、この行を繰り返し使用しますfor lines()。最後に、Rakuは不変文字列を上書きしないように注意するので、S///大文字のS形式を使用します。結果文字列を返す

出力例(すべてのコード例):

03.01.2023,
12.11.2017,
09.04.2022,

https://raku.org

関連情報