0

私は現在このコマンドを使用していますが、

cal $month $year | sed -n '1,2p'
cal $month $year | sed -n '3,$p' |
    sed -n '/'$day'/{s/.*\('$day'.*\)/\1/p; :a; n; p; ba; }'

そして、それは私にこの出力を与えています

    March 2014
Su Mo Tu We Th Fr Sa
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 31

この出力を取得するにはどうすればよいですか?

    March 2014
Su Mo Tu We Th Fr Sa
       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 31

参考:$month $year $day現在の日付を使用しています。別の日だった場合、数字がスペースと一致しないため、一定数のスペースを使用しないようにしています。

編集:ジョナサン・レフラーのために

ありがとうございました!これは、私が探している出力に非常に近づいています。あなたが投稿したサンプル出力はまさに私が探しているものですが、コードを試した後です。代わりにこれをくれました。

March 2014 Su Mo Tu We Th Fr Sa 2 3 4 5 Q6 7 8 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 31

Q の行を削除するにはどうすればよいですか? これはs///あなたが提供した2番目から来ていると思います

編集:

それを理解してください、助けてくれてありがとう!

4

2 に答える 2

2

このスクリプトは機能します(私は思う):

year=2014
month=3
day=6
cal $month $year | sed -n -e '
1,2p
3,${/'$day'/{
  s/^\(.*\)\('$day'.*\)/\1Q\2/
  :blanks
  s/^\( *\)[^ Q]/\1 /g
  t blanks
  s/Q//p
  :a
  n
  p
  ba
  }
}'

出力例:

     March 2014       
Su Mo Tu We Th Fr Sa  
             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 31
  • 最初のs///コマンドは、保持する日の前に Q ( からの出力の一部ではないcal) を配置します。
  • label :blanks、 the 、s///および the はt blanks、空白文字列と非空白文字列、非 Q 文字列を空白文字列と別の空白文字列に置き換え、Q の前にあるすべての非空白文字をザッピングします。
  • s/Q//pマーカーを削除し、行を印刷します。
  • コードの残りの部分は以前と同じです (ただし、複数の行にまたがっています)。入力の次の行を取得し、繰り返し表示します。
于 2014-06-04T23:57:44.933 に答える
0

目的の効果を達成するためのawkスクリプト:

cal.awk :

# Print first two lines (heading)
NR < 3 { print; next } 

# Skip weeks in which the last day is before variable 'day'
$NF < day { next }

# Print full weeks if the first day is on or after variable 'day'
$1 >= day { print; next }

# This will be executed for the week on which variable 'day' falls.
{ 
  # Traverse each day
  for (i=1; i<=NF; ++i) {
    # If current day is on or after variable 'day', print it.
    if ($i >= day) {
      if ($i < 10) # Check for extra formatting for single digit days
        printf(" ");
      printf("%d ", $i); 
    }
    else 
      printf "   "; # Formatting for blank days
  } 
  print ""; # Add new line
} 

呼び出し:

cal $month $year | awk -v day=$day -f cal.awk
于 2014-06-04T23:57:26.443 に答える