我有以下格式的数据:
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”也出现在第五行中,这破坏了逻辑和输出。
我猜想有必要指定只接受第一个条目。我该怎么做?
您可以记住第 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}}'
此解决方案仅适用于您要查找的第二个模式恰好位于四行之后的情况:
$ ugrep -K0001,0003 --max-line=4 -a ' '
--> 1 0001 场 场 场 2 0050 场 场 场 3 ffff场 场 场 4 0003 场 场 场
不幸的是 ugrep 的 -K 选项仅给出第二个模式之前的行: