Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk在文件中进行精确匹配_Bash_Awk - Fatal编程技术网

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

我只是想知道如何使用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
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