월 이름으로 표시된 날짜를 숫자 월 이름으로 변환하는 방법은 무엇입니까?

월 이름으로 표시된 날짜를 숫자 월 이름으로 변환하는 방법은 무엇입니까?

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]. 앞에 0이 허용되지만 필수는 아닙니다.
  • %m월 번호 [01,12]; 앞에 0이 허용되지만 필수는 아닙니다.
  • %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=>]메타 연산자는 주어진 두 목록에서 연속적인 요소를 가져와서 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///경우에 따라 교체)됩니다. 처음 두 코드 예제에서는 -peautoprint 플래그가 사용되었습니다. 왼쪽 절반의 일치 항목은 s///모든 요소를 ​​식별하지만 <(...)> "캡처 마크"날짜와 문자열 월만 캡처되도록 모든 것을 외부에 배치합니다(날짜는 에 입력하고 $0월은 에 입력 $1). 연산자의 오른쪽 절반에서 s///해시 %months값은 $1아래와 같이 변수 key에 입력됩니다. %months{$1}이는 해시 값이 key를 반환하도록 지시합니다 value. 출력에는 일과 월이 모두 사용됩니다 sprintf.

세 번째와 네 번째 코드 예제는 %months해시 값이 한 번만 선언된다는 점을 제외하면 첫 번째 코드 예제와 유사합니다. -pe또는 -ne명령줄 플래그를 사용하는 대신 이 줄은 를 반복하는 데 사용됩니다 for lines(). 마지막으로 Raku는 불변 문자열을 덮어쓰지 않도록 주의하므로 S///대문자 S 형식을 사용합니다.결과 문자열 반환.

출력 예(모든 코드 예):

03.01.2023,
12.11.2017,
09.04.2022,

https://raku.org

관련 정보