Bạn có thể sử dụng nl
để đánh số các dòng (đó là mục đích của chương trình :). Nhưng bạn cần trích xuất tuần đầu tiên trong tháng từ một nơi nào đó. Nó có thể được thực hiện từ ncal
chính nó:
$ ncal -w 2 2012 | tail -1 | awk '{print $1}'
5
Chúng tôi chèn nl
tùy chọn này làm tham số cho tùy chọn -v
(số dòng bắt đầu) và chỉ cho nó biết các dòng số có số hoặc dấu cách.
$ cal 2 2012 | nl -bp'^[0-9 ]\+$' -w2 -s' ' -v$(ncal -w 2 2012 | tail -1 | awk '{print $1}')
February 2012
Su Mo Tu We Th Fr Sa
5 1 2 3 4
6 5 6 7 8 9 10 11
7 12 13 14 15 16 17 18
8 19 20 21 22 23 24 25
9 26 27 28 29
Đây là tất cả mong manh khủng khiếp mặc dù. Dù sao, nếu bạn không cần cal
các tùy chọn nâng cao hơn, nó sẽ hoạt động. Bạn có thể đặt nó trong một tập tin và thay thế "$@"
nơi tôi đặt 2 2012
.
EDIT: Nhưng đây là SAI! Tôi chỉ nhận thấy rằng tuần đầu tiên trong tháng 1 có thể có số 52 hoặc 53! Vì vậy, chúng ta chỉ cần tạo một ngoại lệ cho tháng 1 hoặc chỉ trích xuất tất cả các số trong tuần ncal
và áp dụng chúng cho đầu ra của cal
.
Đây là giải pháp tôi nghĩ ban đầu, nhưng tôi nghĩ (một cách sai lầm) tôi sẽ đơn giản hóa nó bằng cách sử dụng nl
. Nó sử dụng paste
, hợp nhất các tập tin cạnh nhau. Vì không có bất kỳ tập tin nào, chúng tôi phải sử dụng bashism <(...)
; đó là những gì tôi đã cố gắng tránh
"Tập tin" đầu tiên của chúng tôi sẽ là một danh sách các số trong tuần, với hai dòng trống ở đầu:
$ printf ' \n \n' && printf '%2d \n' $(ncal -w 1 2011 | tail -1)
52
1
2
3
4
5
Cái thứ hai, chỉ là đầu ra của cal
. Tất cả cùng nhau, như là tham số để paste
:
$ paste -d' ' <(printf ' \n \n' && printf '%2d \n' $(ncal -w 1 2011 | tail -1)) <(cal 1 2011)
January 2011
Su Mo Tu We Th Fr Sa
52 1
1 2 3 4 5 6 7 8
2 9 10 11 12 13 14 15
3 16 17 18 19 20 21 22
4 23 24 25 26 27 28 29
5 30 31
Bừa bộn hơn nhiều và không tương thích với nhau. Vây ...
gcal --starting-day=Monday --with-week-number
phù hợp với nhu cầu của tôi hơn nhưng công cụ này là tuyệt vời.