1

cal | tail -6Unix マシンで" " を試すと、-

             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 & 6 です。しかし、" cal" の奇妙な動作のために間違った出力が得られます。

4

5 に答える 5

8

最初の行には空白で区切られた列が 3 つしかありません。 cal修正されたとおりに正確に機能していますが、どのように機能するかを理解していませんawk。懸念される限りawk、固定幅の列ではなく、空白で区切られた列に注意が向けられるため、最初の行に7番目の列はありません。

簡単なGoogle検索で、使用できることがわかります

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

あなたのawkスクリプトで。

于 2012-11-12T17:32:52.980 に答える
0

オフにしない限り、今日の日付が強調表示されることに注意してください(-h)。cut必要な列を抽出するために使用します。

cal -h | cut -c19-20

出力:

Sa
 3
10
17
24
于 2012-11-13T08:53:48.393 に答える
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

行ごとの抽出がうまくいくかもしれません。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

各行の列はすべて 3 文字幅なので、これを使用して希望する日を抽出できます。たとえば、列の 7 日目だけが必要な場合は、次のようにします。

cal | sed 's/^\(.\{18\}\).*$/\1/'

このコマンドは、行の最初の 18 文字を削除します。これは、週の最初の 6 日間のエントリです。

4 日目などの特定の日を抽出するには、次のようにします。

cal | sed 's/^.\{9\}\(.\{3\}\).*$/\1/'

週の最初の日と最後の日を削除するには、次のようにします。

cal | sed -e 's/^.\{3\}//' -e 's/^\(.\{15\}\).\{3\}$/\1/'
于 2012-11-12T21:49:51.007 に答える