【问题标题】:extract header if pattern in a column matches如果列中的模式匹配,则提取标题
【发布时间】:2014-07-23 07:58:28
【问题描述】:

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

这是一个例子:

[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  

我希望我能够清楚地表达我的问题和担忧。

【问题讨论】:

    标签: linux date awk sed cut


    【解决方案1】:

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

    【讨论】:

    • 如何设置另一个日期,如4 并获得Fr
    • 还是不行。日期 4 给出We,正确的是Fr,最后你错过了一个单引号。
    • @Jotne 复制粘贴错误。现在已修复,包括日期问题。
    • +1 来自我,因为找到了一种不需要 GNU awk 的 FIELDWIDTHS 的方法,这可能是对 OP 盒子的祝福,它甚至无法正确执行 date
    • @konsolebox 现在它不能正常工作了。我得到Sa 31
    【解决方案2】:

    这是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 FIELDWIDTH 介绍于gnu awk 2.31

    【讨论】:

    • 你比我快1分钟!你可以做if($1==date)print a[i]
    • @MarkSetchell 谢谢,我确实看到应该只有一次点击,所以不需要结束部分。已更新。
    【解决方案3】:

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

    【讨论】:

    • 对于 perl,我建议使用核心模块 Time::Pieceperl -mTime::Piece -E 'say Time::Piece-&gt;strptime("20140731","%Y%m%d")-&gt;fullday'
    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2019-12-08
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    相关资源
    最近更新 更多