Regex 打印行,直到第二个字段更改
假设这是我的命令行输出:Regex 打印行,直到第二个字段更改,regex,shell,command-line,awk,sed,Regex,Shell,Command Line,Awk,Sed,假设这是我的命令行输出: Mike US 11 John US 3 Dina US 1002 Dan US 44 Mike UK 552 Luc US 23 Jenny US 23 我想打印从第一行开始的所有行,并在第二个字段更改为“US”以外的内容时停止打印,即使之后有更多的“US”。因此,我希望输出为: Mike US 11 John US 3 Dina US 1002 Dan US 44 这是我
Mike US 11
John US 3
Dina US 1002
Dan US 44
Mike UK 552
Luc US 23
Jenny US 23
我想打印从第一行开始的所有行,并在第二个字段更改为“US”以外的内容时停止打印,即使之后有更多的“US”。因此,我希望输出为:
Mike US 11
John US 3
Dina US 1002
Dan US 44
这是我现在掌握的代码:
awk '$2 == "US"{a=1}$2 != "US"{a=0}a'
只要在我匹配的范围之后没有更多的“我们”,它就可以正常工作。因此,我当前的代码输出如下:
Mike US 11
John US 3
Dina US 1002
Dan US 44
Luc US 23
Jenny US 23
正如您可能注意到的,它放弃了“UK”行并继续打印,这不是我在这里想要实现的。我相信还有更优雅的东西,但这确实起到了作用:
awk 'BEGIN { P=1 } P == 1 && $2 != "US" { P = 0 }P' filename
我相信还有更优雅的东西,但这就是工作:
awk 'BEGIN { P=1 } P == 1 && $2 != "US" { P = 0 }P' filename
这是一种通用方法,它打印到第二个字段更改,而不考虑第二个字段中的数据
awk '$2!=f && NR>1 {exit} 1; {f=$2}' file
Mike US 11
John US 3
Dina US 1002
Dan US 44
这只是测试它的US
,如果不退出。也许你的问题更正确:
awk '$2!="US" {exit}1' file
Mike US 11
John US 3
Dina US 1002
Dan US 44
这是一种通用方法,它打印到第二个字段更改,而不考虑第二个字段中的数据
awk '$2!=f && NR>1 {exit} 1; {f=$2}' file
Mike US 11
John US 3
Dina US 1002
Dan US 44
这只是测试它的US
,如果不退出。也许你的问题更正确:
awk '$2!="US" {exit}1' file
Mike US 11
John US 3
Dina US 1002
Dan US 44
这可能适用于您(GNU-sed):
如果该行不包含US
退出
具体而言,第二个字段:
sed '/^\S\+\s\+US\b/!Q' file
这可能适用于您(GNU-sed):
如果该行不包含US
退出
具体而言,第二个字段:
sed '/^\S\+\s\+US\b/!Q' file
@Sameh可以很好地处理测试数据。提供与我在帖子中发布的相同的输出。@Sameh可以很好地处理您的测试数据。提供与我在帖子中发布的内容相同的输出。