繁体   English   中英

AWK仅匹配多行文本中的行的第一个匹配项

[英]Awk only match first match of line in multiline text

我正在尝试匹配一个特定的数字( 06:00 )和( 9:00 ),如果它是多行文件中一行的第一个匹配项。 我对awk的了解有限,似乎出现的问题是我要么只获得第一个匹配项,要么也得到了第二个匹配项。 我也想统计最终的比赛次数和结束次数,但是由于比赛不正确,所以我还没走那么远。

Schedule in <06:00>:12 out <06:00>:0
Schedule in <08:00>:10 out <06:00>:0
Schedule in <06:00>:9 out <05:00>:0
Schedule in <07:00>:13 out <08:00>:0
Schedule in <06:00>:12 out <09:00>:0
Schedule in <09:00>:12 out <06:00>:0
Schedule in <07:00>:11 out <06:00>:0

我试过了:

awk '/06/||/09/' schedule.txt

awk '$1 ~ /\<06/||/\<09/ {print $1}' schedule.txt

正确的输出:

Schedule in <06:00>:12 out <06:00>:0
Schedule in <06:00>:9 out <05:00>:0
Schedule in <06:00>:12 out <09:00>:0
Schedule in <09:00>:12 out <06:00>:0
4 Total Matches

关于什么:

awk '$3 ~ /<06/||/<09/ {print $0}' schedule.txt
#     ^                        ^

关键是默认情况下, awk每个字符串标记为用空格分隔的单词。 $1第一个“单词”, $1中的第二$2 ,依此类推。 $0是整行。

给定您的输入行之一:

Schedule in <06:00>:12 out <06:00>:0
<------> <> <--------> <-> <------->
   $1    $2    $3       $4    $5
<---------------------------------->
                 $0

我只是将您的awk程序更改为测试$3 ,这似乎是正确的字段。 在匹配的情况下,我打印整行( $0 )。

另外, print $0可能会缩短为print 许多在awk接受字符串的命令/函数默认为$0


还有一些“装饰”:

sh$ awk '$3 ~ /<06/||/<09/ {count++; print $0} END {printf("%d Total Matches\n", count) }' schedule.txt
Schedule in <06:00>:12 out <06:00>:0
Schedule in <06:00>:9 out <05:00>:0
Schedule in <06:00>:12 out <09:00>:0
Schedule in <09:00>:12 out <06:00>:0
4 Total Matches

最后,如@Jidder所说:

“这都可以简化为:”

 awk 'END {print x,"Total Matches"} $3~/0[69]:/&&++x' 

Awk是一种编程语言,它假定您正在遍历文件。 我们可以利用awk提供给我们的所有功能,包括许多内置函数中的文本。

在Awk中,您通常具有定义明确的字段,但不必这样做。 在您的示例中,我们可以将每一行视为一个字段,并且可以使用substr提取所需的信息。 时间恰好是该行上14个字符的位置(第一列的第一个字符是第1列,而不是第0列)。 我们想要从位置14开始的五个字符:

awk 'substr ($0, 14, 5) ~ /06|9:00/' test.txt

我将这5个字符与正则表达式/06|9:00/ 如果此布尔表达式为true,则打印出整行。

这与以下更完整的Awk程序相同:

awk '{
    if ( substr ( $0, 14, 5 ) ~ /06|9:00/ ) {
        print $0
    }
}' test.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM