打印行直到第二个字段更改

时间:2014-05-21 19:21:04

标签: 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

这是我现在的代码:

awk '$2 == "US"{a=1}$2 != "US"{a=0}a'

只要在我匹配的范围之后没有“US”,它就能正常工作。所以我当前的代码将输出如下:

Mike    US  11
John    US  3
Dina    US  1002
Dan     US  44
Luc     US  23
Jenny   US  23

正如您可能注意到的那样,它放弃了“英国”系列并继续打印,这不是我想要在这里实现的。

3 个答案:

答案 0 :(得分:3)

这是一种通用方法,无论第二个字段中的数据如何,它都会打印到第二个字段更改

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

答案 1 :(得分:1)

我确信有一些更优雅的东西,但这可以胜任:

awk 'BEGIN { P=1 } P == 1 && $2 != "US" { P = 0 }P' filename

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed '/US/!Q' file

如果该行不包含US退出。

特别是第二个字段:

sed '/^\S\+\s\+US\b/!Q' file