[英]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.