网站搜索

如何使用 awk 使用特定于模式的操作来过滤文本或字符串


在 Awk 命令系列的第三部分中,我们将研究基于用户可以定义的特定模式过滤文本或字符串。

有时,在过滤文本时,您希望根据给定条件或使用可匹配的特定模式来指示输入文件中的某些行或字符串行。使用 Awk 执行此操作非常简单,这是 Awk 的强大功能之一,您会发现它很有帮助。

让我们看一下下面的示例,假设您有一个想要购买的食品的购物清单,名为 food_prices.list。它有以下食品及其价格清单。

$ cat food_prices.list 
No	Item_Name		Quantity	Price
1	Mangoes			   10		$2.45
2	Apples			   20		$1.50
3	Bananas			   5		$0.90
4	Pineapples		   10		$3.46
5	Oranges			   10		$0.78
6	Tomatoes		   5		$0.55
7	Onions			   5            $0.45

然后,您想在价格大于 $2 的食品上指示 (*) 符号,可以通过运行以下命令来完成:

awk '/ *$[2-9]\.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list

从上面的输出中,您可以看到在包含食品、芒果菠萝的行末尾有一个(*)符号>。如果你检查一下他们的价格,就会发现它们高于2 美元

在此示例中,我们使用了两种模式:

  1. 第一个: / *\$[2-9]\.[0-9][0-9] */ 获取食品价格大于 $2
  2. 第二个: /*\$[0-1]\.[0-9][0-9] */ 查找食品价格低于 $2 的行。

这就是发生的情况,文件中有四个字段,当模式一遇到食品价格大于 $2 的行时,它会打印所有四个字段和一个 (*) 符号在行尾作为标志。

第二种模式只是打印食品价格低于 $2 的其他行,正如它们出现在输入文件 food_prices.list 中一样。

通过这种方式,您可以使用特定于模式的操作来过滤掉价格高于 $2 的食品,尽管输出存在问题,即具有 (*) 的行符号的格式与其余行不同,导致输出不够清晰。

我们在 awk 系列的第 2 部分中看到了同样的问题,但我们可以通过两种方式解决它:

1. 使用 printf 命令,使用以下命令是一种漫长而无聊的方式:

awk '/ *$[2-9]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4 "*" ; } / *$[0-1]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4; }' food_prices.list 

2. 使用$0字段。 awk 使用变量 0 来存储整个输入行。这对于解决上述问题很方便,而且简单快捷,如下所示:

awk '/ *$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list 

结论

现在就是这样,这些是使用模式特定操作过滤文本的简单方法,可以帮助使用 Awk 命令标记文件中的文本行或字符串。

希望本文对您有所帮助,并记住阅读本系列的下一部分,该部分将重点介绍如何使用 awk 工具使用比较运算符。