Awkを使用して、パターン固有のアクションを使用してテキストまたは文字列をフィルタリングする方法


Awkコマンドシリーズの第3部では、ユーザーが定義できる特定のパターンに基づいてテキストまたは文字列をフィルタリングする方法について説明します。

テキストをフィルタリングするときに、特定の条件に基づいて、または一致する可能性のある特定のパターンを使用して、入力ファイルの特定の行または文字列の行を示したい場合があります。 Awkでこれを行うのは非常に簡単です。これは、Awkの優れた機能の1つであり、役に立ちます。

以下の例を見てみましょう。たとえば、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

次に、価格が より大きい食品に(*)記号を指定する場合は、次のコマンドを実行します。

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

上記の出力から、食品、マンゴー、パイナップルを含む行の最後に(*)記号があることがわかります。価格を確認すると、上にあります。

この例では、次の2つのパターンを使用しました。

  1. the first: / *\$[2-9]\.[0-9][0-9] */ gets the lines that have food item price greater than $2 and
  2. the second: /*\$[0-1]\.[0-9][0-9] */ looks for lines with food item price less than $2.

これが起こることです。ファイルには4つのフィールドがあり、パターン1で食品の価格がより大きい行に遭遇すると、4つのフィールドすべてが出力され、最後に(*)記号が表示されます。フラグとしての行。

2番目のパターンは、入力ファイルfood_prices.listに表示されるよりも低い食品価格で他の行を単純に印刷します。

このように、パターン固有のアクションを使用して、上記の価格の食品を除外できます。出力に問題はありますが、(*)記号のある行は他の行のようにフォーマットされません。出力を十分に明確にしない行の。

awkシリーズのパート2でも同じ問題が発生しましたが、次の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.shフィールドを使用します。 Awkは、変数0を使用して入力行全体を格納します。これは上記の問題を解決するのに便利で、次のように簡単で高速です。

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

結論

今のところ以上です。これらは、Awkコマンドを使用してファイル内のテキストまたは文字列の行にフラグを立てるのに役立つ、パターン固有のアクションを使用してテキストをフィルタリングする簡単な方法です。

この記事がお役に立てば幸いです。また、awkツールを使用した比較演算子の使用に焦点を当てるシリーズの次のパートを読むことを忘れないでください。