Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix Kornshell-如何正确打印空白和校准_Unix_Sed_Ksh_Cal - Fatal编程技术网

Unix Kornshell-如何正确打印空白和校准

Unix Kornshell-如何正确打印空白和校准,unix,sed,ksh,cal,Unix,Sed,Ksh,Cal,我正在使用这个命令 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

我正在使用这个命令

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
如何获得此输出

仅供参考:
$month$year$day
正在使用当前日期。 我试图避免使用一定数量的空格,因为如果是不同的一天,那么这些数字将与空格不匹配

编辑:乔纳森·莱弗勒

谢谢大家!!这是真的越来越接近我所期待的输出。您发布的示例输出正是我想要的,但是在尝试了您的代码之后。它给了我这个

2014年3月
苏莫图我们是法国的
2 3 4 5问题6 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//

编辑:


想清楚了,谢谢你的帮助

一个
awk
脚本以达到预期效果:

校准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
} 
这个脚本很有效(我认为):

样本输出:

     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
    输出的一部分)
  • 标签
    :空格
    s//
    t空格
    用空格串和另一个空格替换一个空格串和一个非空格、一个非Q,将Q前面的所有非空格字符进行重映射
  • s/Q//p
    删除标记并打印线条
  • 代码的其余部分与之前相同(但分布在多行上);它获取下一行输入并重复打印

我假定您在尝试运行此片段时设置了
日=4
月=3
年=2014
。最好创建一个SSCCE(),在本例中,这意味着显式设置三个变量。那里有太多的
sed
命令;你应该能一次完成这一切。
cal $month $year | awk -v day=$day -f cal.awk
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