仅接受第一个条目

问题描述 投票:0回答:2

我有以下格式的数据:

1    0001    field   field   field
2    0050    field   field   field
3    ffff    field   field   field
4    0003    field   field   field
5    0001    field   field   field
6    0004    field   field   field
7    0002    field   field   field
8    0100    field   field   field
9    wwww    field   field   field

我需要以 $2 == "0001" 开头并以 $2 == "0003" 结尾的行,即:

1    0001    field   field   field
2    0050    field   field   field
3    ffff    field   field   field
4    0003    field   field   field

然后这样做:

awk '$2 == "0001", $2 == "0003"' ./file.txt

但是我得到了所有行的响应,可能是因为除了第一行之外,“0001”也出现在第五行中,这破坏了逻辑和输出。

我猜想有必要指定只接受第一个条目。我该怎么做?

awk
2个回答
1
投票

您可以记住第 2 列中第一次出现的

0001
,直到您在第 2 列中遇到
0003

awk '$2 == "0001" {found=1} found; found && $2 == "0003" {exit}' file

将found设置为1后,检查found的值。如果为 1,则计算结果为 true 并打印整行。

如果您也只想在实际找到

0001
时退出,则检查是否已找到两者以及第 2 列是否为
0003
。如果是这种情况,请退出。

输出

1    0001    field   field   field
2    0050    field   field   field
3    ffff    field   field   field
4    0003    field   field   field

或者检查是否找到过一次:

awk '$2 == "0001" {found=1} found {print; if($2=="0003") {exit}}' 

0
投票

此解决方案仅适用于您要查找的第二个模式恰好位于四行之后的情况:

$ ugrep -K0001,0003 --max-line=4 -a ' '

--> 1 0001 场 场 场 2 0050 场 场 场 3 ffff场 场 场 4 0003 场 场 场

不幸的是 ugrep 的 -K 选项仅给出第二个模式之前的行:

ugrep -K0001,0003 -a ' ' t.txt

1 0001 场 场 场 2 0050 场 场 场 3 ffff场场场

© www.soinside.com 2019 - 2024. All rights reserved.