如果列中的模式匹配,则提取标题

我试图提取和打印文件的标题,如果该特定列中的模式匹配。

这里是一个例子:

[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 

预期产出:

如果inputdate= 31,则打印31日的一天。

只是要清楚,我不能使用date-d标志作为我的操作系统不支持。可能需要awk在这里来解决这个问题。

 [user ~]$ date -d 20140731 +%A Thursday 

我希望我能够清楚地expression我的疑问和关注。

这是一个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 

PS FIELDWIDTHgnu awk 2.31引入

使用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 

解析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