如果特定列中的模式匹配,我试图提取并打印文件的标题。
这是一个例子:
[user ~]$ cal |sed 's/July 2014//'
Su Mo Tu We Th Fr Sa
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 31
预期产出:
如果输入日期= 31,则在31日打印当天。
为了清楚起见,我不能使用date -d标志,因为我的操作系统不支持它。可能需要awk来破解这个问题。
[user ~]$ date -d 20140731 +%A
Thursday
我希望我能够清楚地表达我的问题和疑虑。
答案 0 :(得分:2)
使用awk:
cal | awk -v date=31 'NR == 2 { split($0, header) } NR > 2 { for (i = 1; i <= NF; ++i) if ($i == date) { print header[NR == 3 ? i + 7 - NF : i]; exit } }'
输出:
Th
答案 1 :(得分:1)
以下是gnu awk
解决方案:
cal | awk -v date=31 -v FIELDWIDTHS="3 3 3 3 3 3 3 3" 'NR==2 {split($0,a)} {for (i=1;i<=NF;i++) if ($i==date) print a[i]}'
Th
您将要显示的date
设置为变量,因此可以将其更改为您喜欢的内容。
或者可以这样写:
cal | awk 'NR==2 {split($0,a)} {for (i=1;i<=NF;i++) if ($i==date) print a[i]}' FIELDWIDTHS="3 3 3 3 3 3 3 3" date=31
FIELDWIDTH
gnu awk 2.31
答案 2 :(得分:1)
解析cal
的输出并不是那么明智......
您的操作系统可以date
处理-j
吗?
date -j 073100002014 "+%a"
Thu
您的操作系统如何perl
?
perl -MDateTime -E '$dt=DateTime->new(year=>2014,month=>7,day=>31);say $dt->day_name'
Thursday
或者,如果它没有perl -E
,你可以做
perl -MDateTime -e '$dt=DateTime->new(year=>2014,month=>7,day=>31);print $dt->day_name'
Thursday
您的操作系统如何php
?
php -r '$jd=cal_to_jd(CAL_GREGORIAN,7,31,2014);echo(jdk($jd,2));'
Thu