1

当我在我的 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去哪儿了?cal我的要求基本上是所有工作日,即第 2、3、4、5 和 6 列。但是由于“ ” 的奇怪行为,我得到了错误的输出

4

5 回答 5

8

第一行中只有 3 个空格分隔的列。 cal完全按照正确的方式工作,您不了解其awk工作原理。就awk您而言,第一行中没有第 7 列,因为它会引起对空格分隔列的关注,而不是固定宽度的列。

快速谷歌搜索显示您可以使用

BEGIN  { FIELDWIDTHS = "3 3 3 3 3 3 3" }

在你的awk脚本中。

于 2012-11-12T17:32:52.980 回答
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/'
于 2012-11-12T21:49:51.007 回答
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
于 2012-11-12T21:56:30.687 回答
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
于 2012-11-12T22:07:59.000 回答
0

请注意,除非您将其关闭 ( -h),否则今天的日期会突出显示。用于cut提取想要的列:

cal -h | cut -c19-20

输出:

Sa
 3
10
17
24
于 2012-11-13T08:53:48.393 回答