假设这是我的命令行输出:
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
正如您可能注意到的那样,它放弃了“英国”系列并继续打印,这不是我想要在这里实现的。
答案 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