Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Regex 打印行,直到第二个字段更改_Regex_Shell_Command Line_Awk_Sed - Fatal编程技术网

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可以很好地处理您的测试数据。提供与我在帖子中发布的内容相同的输出。