AWKで文字列に変数を挿入する

AWKで文字列に変数を挿入する

ループとawkコマンドを使用して、単純なbashスクリプトに変数を渡そうとします。

#!/bin/bash
#! script to filter data to respective directories.

for i in {1..9};
do
        awk  -F "\t" -v num="$i" '$3 ~ /^ *2017-0$num/ {print}' source1.txt source2.txt  > energydata/2017/$i/results.txt
done;

次のように awk コマンドを正常に実行できます。

        awk  -F "\t" '$3 ~ /^ *2017-01/ {print}' source1.txt source2.txt  > energydata/2017/1/results.txt

私は日付の月の列を繰り返してこのプロセスを自動化できるようにしたいです。 -v変数passを誤って使用しているようですが、このような日付に変数を追加する方法がわからないようです。設定された日付にawkステートメントをインラインで実行すると機能することがわかります。ただ私を防ぐ変数を挿入しようとするだけです。

どんなヒントや提案でも役に立ちます

入力と出力の例:

ソース 1.txt:

1   dog   2020-02-03 
2   cat   2017-01-12

ソース2.txt:

5   Frog  2022-02-05 
7   Mouse   2017-01-11

出力:エネルギーデータ/2017/01/results.txt

2   cat   2017-01-12
7   Mouse   2017-01-11

ベストアンサー1

私の記憶が正しい場合、この/.../ 構文はAWKの定数正規表現でのみ機能します。他の正規表現と一致させるには、それを文字列として渡す必要があります。また、$番号付きフィールドを選択する演算子だけでは変数を拡張しません。代わりに、文字列および/または変数を連続して作成して連結するだけです。

たとえば、これはうまくいきます

% echo 2017-01 | awk -v m=1 '$1 ~ "2017-0" m { print "match" }'
match

またはこれを行うこともできますが、{ pattern = "2017-0" m; if ($1 ~ pattern) ... }それほど簡潔ではありません。


とにかく、入力行を内容に応じてファイルに分割するには、AWKにファイル名を作成して出力ファイル自体を開くようにすることもできます。

たとえば、これは、およびなどのファイル名を作成します。ここで、およびは行の3番目のフィールドから選択されます。ただし、事前にディレクトリを作成する必要があります。energydata/yyyy/mm/results.txtyyyymm

awk -F "\t" '{ split($3, date, "-");
               filename = "energydata/" date[1] "/" date[2] "/results.txt";
               print > filename }' source.txt

おすすめ記事