Câu hỏi Chuyển đổi số tháng sang tháng


Có cách nào để chuyển đổi số tháng thành tên bằng tập lệnh không?

thí dụ:

2013-10-22 sẽ trở thành Oct 22

Cảm ơn.

BTW, tôi không có ngày GNU và hệ điều hành của tôi là AIX.


2
2017-10-31 09:58


gốc




Các câu trả lời:


Bạn nên có một awk (hoặc là nawk):

BEGIN {
    nmon=split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",month)
    for(mm=1;mm<=nmon;mm++) {
        month[month[mm]]=mm
        month[sprintf("%02i",mm)]=month[mm]
    }
}

/[12][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]/ {
    split($1,bits,/-/)
    printf("%s %02i\n",month[bits[2]],bits[3])
}

Các BEGIN{} khối tạo băm bản đồ. Đó là một mục đích chung hơn một chút so với bạn nghiêm chỉnh cần (tôi chỉ xảy ra để có nó nằm xung quanh), chỉ số của nó là tên ngắn, tháng thứ tự (số) và hai chữ số tháng thứ tự với một số không hàng đầu. Điều này có nghĩa là bạn có thể chuyển đổi tên thành số hoặc ngược lại. Bạn có thể dễ dàng điều chỉnh nó cho các tên tháng dài quá (và có thể địa phương hóa, nhưng chúng ta không được mang đi).

Khối tiếp theo tìm kiếm các dòng có chứa chuỗi ngày tháng có khả năng tìm kiếm, chia nhỏ thành "-" và chuyển đổi ngày. (Điều này cũng làm việc trong gawk, nhưng nếu bạn có điều đó, thì strftime() và mktime() là một giải pháp thanh lịch hơn.)

Cơ bản ksh phiên bản shell, vì AIX đã ksh:

set -A month pad Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

while IFS=- read yyyy mm dd junk; do
    echo ${month[$mm]}
done

Điều này sử dụng mảng (POSIX sh không có mảng, bash không, vì vậy bạn có thể làm một cái gì đó tương tự với nó quá). Lưu ý rằng điều này dựa vào ksh để xử lý 0 hàng đầu trong một số tháng, nó chỉ xử lý nó như một số nguyên. Vì ksh (và bash) các mảng dựa trên 0, chúng ta đặt một giá trị "pad" giả vào chỉ mục 0 thay vì chơi với + 1 / -1 trên các chỉ mục.


1
2017-10-31 11:02





date +"%B %d"

Sẽ hiển thị January 1

date +"%b %d"

Sẽ hiển thị Jan 1


1
2017-10-31 10:42