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

时间:2014-07-23 07:58:28

标签: linux date awk sed cut

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

这是一个例子:

[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  

我希望我能够清楚地表达我的问题和疑虑。

3 个答案:

答案 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

中引入了PS 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