Bash 使用awk在文件中进行精确匹配
我只是想知道如何使用awk进行精确匹配 例如Bash 使用awk在文件中进行精确匹配,bash,awk,Bash,Awk,我只是想知道如何使用awk进行精确匹配 例如 $ cal 09 09 2009 September 2009 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 $ cal 09 09 2009 | awk '{day="9"; col=index($0,day); print col }' 17 0 0 11 2
$ cal 09 09 2009
September 2009
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
$ cal 09 09 2009 | awk '{day="9"; col=index($0,day); print col }'
17
0
0
11
20
0
8
0
如您所见,上面的命令输出包含字符串/数字“9”的所有行的索引号,是否有办法使awk输出索引号仅出现在上面cal输出的第4行。???可能是更优雅的解决方案
我正在使用awk通过cal命令获取日期名称。以下是全部代码:
$ dayOfWeek=$(cal $day $month $year | awk '{day='$day'; split("Sunday Monday Tuesday Wednesday Thursday Friday Saturday", array); column=index($o,day); dow=int((column+2)/3); print array[dow]}')
上面代码的问题是,如果找到多个匹配项,那么我会得到多个结果,而我希望它只输出一个结果
谢谢 将对
index()
的调用限制为仅对那些“日”被空格包围的行:
awk -v day=$day 'BEGIN{split("Sunday Monday Tuesday Wednesday Thursday Friday Saturday", array)} $0 ~ "\\<"day"\\>"{for(i=1;i<=NF;i++)if($i == day){print array[i]}}'
你写的
加州2009年9月9日
我不知道有哪个版本的cal接受月日作为输入,
只有
但是,这并不影响你的主要问题
你写的
有没有办法只在上面cal输出的第4行中生成awk输出索引号
NR(numrec)是你的朋友
有很多方法可以使用它
cal 09 09 2009 | awk 'NR==4{day="9"; col=index($0,day); print col }'
或
也
在awk中,如果在整个程序中都应该使用变量赋值,那么最好使用BEGIN部分,以便赋值只执行一次。对你来说没什么大不了的,但是为什么要养成坏习惯呢
因此
最后
你想解决什么问题还不完全清楚。你确定你总是想抢4号线吗?如果没有,那么你打算如何解决这个问题
表示为“1.我正在尝试执行X.2.这是我的输入。3.这是我的输出。4.这是生成该输出的代码”的问题更容易回答
看起来你在计算日期。通过使用gnu date命令,您可以获得更加健壮和通用的解决方案。我已经看到了许多关于这个问题的有用讨论,标记为bash,shell,(date?)
我希望这有帮助。如果希望awk只输出第4行,请将规则限制在第4行: $ awk 'NR == 4 { ... }' $awk'NR==4{…}
在一种内置了时间功能的语言中,这要容易得多。Tcl在这方面很好,但其他许多语言也很好:
$ echo 'puts [clock format [clock scan 9/9/2009] -format %a]' | tclsh
Wed
真棒的SeigeX!这正是我要找的!你又救了我一命。我记得你过去也曾帮助过我!:)@Jasdeep看到我的更新,我想你可以通过
日期以一种更简单的方式来完成command@SeigeX:我知道date命令以及如何使用date实现相同的功能,但不幸的是,我需要支持0001-9999之间的年份,这只能通过cal命令实现<代码>日期
在使用32位计算的计算机上,2038年之后和1901年之前的命令都会消失…@Seigex:我发现这个解决方案存在一个小问题,日历最右侧的任何日期都不起作用。例如,尝试1956年2月18日(dd-mm-yyyy)任何解决方案,我尝试将cal 09 09 2009 | awk 'NR==4{day="9"; col=index($0,day); print col }'
cal 09 09 2009 | awk '{day="9"; if (NR==4) {col=index($0,day); print col } }'
cal 09 2009 | awk 'BEGIN{day="9"}; NR==4 {col=index($0,day); print col }'
$ awk 'NR == 4 { ... }'
$ echo 'puts [clock format [clock scan 9/9/2009] -format %a]' | tclsh
Wed