extract header if pattern in a column matches

陌路散爱 提交于 2019-12-12 01:59:30

问题


I am trying to extract and print header of a file if the pattern in that particular column matches.

Here is a example :

[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  

Expected output :

if input date =31 then print the day on 31st.

Just to be clear, I cannot use date -d flag as its not supported by my OS.Probably would need awk here to crack the question.

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

I hope I am able to convey my question and concern clearly.


回答1:


Here is a gnu awk solution:

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

You set the date that you like to be displayed as a variable, so it can be change to what you like.

Or it could be written like this:

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 was introduced in gnu awk 2.31




回答2:


Using 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 } }'

Output:

Th



回答3:


Parsing the output of cal isn't really that advisable...

Can your OS's date handle -j?

date -j 073100002014 "+%a"
Thu

How is your OS at perl?

perl -MDateTime -E '$dt=DateTime->new(year=>2014,month=>7,day=>31);say $dt->day_name'
Thursday

Or, if it doesn't do perl -E, you could do

perl -MDateTime -e '$dt=DateTime->new(year=>2014,month=>7,day=>31);print $dt->day_name'
Thursday

How is your OS at php?

php -r '$jd=cal_to_jd(CAL_GREGORIAN,7,31,2014);echo(jdk($jd,2));'
Thu


来源:https://stackoverflow.com/questions/24904853/extract-header-if-pattern-in-a-column-matches

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!