当我在我的unix机器上尝试“cal | tail -6
”时,我得到了 -
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
但是当我尝试“cal | tail -6 | awk '{print $7}'
”时,我得到了 -
10
17
24
3在哪里?我的要求基本上是所有工作日,即第2,3,4,5和2栏。 6。
但由于“cal
”
答案 0 :(得分:8)
第一行中只有3个以空格分隔的列。 cal
工作完全正确,您不了解awk
的工作原理。就awk
而言,第一行中没有第7列,因为它会引起对空白分隔列的注意,而不是固定宽度列。
快速谷歌搜索显示您可以使用
BEGIN { FIELDWIDTHS = "3 3 3 3 3 3 3" }
在awk
脚本中。
答案 1 :(得分:0)
由于每行中的所有列都是三个字符宽,因此您可以使用它来提取您希望的日期。例如,如果您只希望列中的第7天,则可以执行以下操作:
cal | sed 's/^\(.\{18\}\).*$/\1/'
此命令将删除行中的前18个字符,即一周中前6天的条目。
要提取某一天,例如第四天,您可以这样做:
cal | sed 's/^.\{9\}\(.\{3\}\).*$/\1/'
要删除一周的第一天和最后一天,您可以执行以下操作:
cal | sed -e 's/^.\{3\}//' -e 's/^\(.\{15\}\).\{3\}$/\1/'
答案 2 :(得分:0)
可能是一个行式提取就行了。试试ncal。例如:
$ ncal
November 2012
Mo 5 12 19 26
Tu 6 13 20 27
We 7 14 21 28
Th 1 8 15 22 29
Fr 2 9 16 23 30
Sa 3 10 17 24
Su 4 11 18 25
答案 3 :(得分:0)
或用占位符填写缺席日期(例如' - '):
kent$ cal -s|tail -6|awk 'NR==1&&NF<7{gsub(/^ */,"");for(i=1;i<=(7-NF);i++) x=" - "x;$0=x" "$0;}1'
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
然后您可以获取该列,如果需要,将“ - ”替换为“”。例如$7:
kent$ cal -s|tail -6|awk 'NR==1&&NF<7{gsub(/^ */,"");for(i=1;i<=(7-NF);i++) x=" - "x;$0=x" "$0;}{print $7}'
3
10
17
24
答案 4 :(得分:0)
请注意,今天的日期会突出显示,除非您将其关闭(-h
)。使用cut
提取所需列:
cal -h | cut -c19-20
输出:
Sa
3
10
17
24