
test_data.txtというファイルがあります。ファイルの内容は次のとおりです。
20:20:20 test1
20:21:21 test2
20:21:49 test3
20:21:57 test4
20:21:57 test5
20:21:57 test6
20:22:57 test7
20:25:59 test8
20:25:59 test9
20:25:59 test10
20:25:59 test11
20:29:03 test12
20:29:04 test13
20:29:31 test14
たとえば、最初の列は私が検索したいものです。最初の列には時:分:秒(HH:MM:SS)が表示されます。時間と分が満たされたら、変数を使用して行全体のデータを抽出したいと思います。
var1=20:20
var2=20:22
cat test_data.txt | awk '{if ($1 == "'"$var1"'" || $1 == "'"$var2"'") print $0;}'
予想出力:
20:20:20 test1
20:22:57 test7
私が使用しているawkは数秒以内に検索したくないので、明らかに動作しません。以下のアプローチはうまくいきますが、例で複数の変数を使用する方法は次のとおりです。
var1=20:20
var2=20:22
ERE='^'$var1':[[:digit:]]+$' <test_data.txt awk '$1 ~ ENVIRON["ERE"]'
上記が同じコマンドで複数の変数で動作するかどうかはわかりません。
上記のコマンドの出力:
20:20:20 test1
答え1
複数のHH:MM値をスペースで区切られた文字列としてawkに渡すことができ、この文字列はawk BEGINブロックの配列に分割されます。次に、データファイルの各レコードに対して$ 1がHH:MM文字列の1つで始まるかどうかをテストします。
awk -v times="20:20 20:22" '
BEGIN {n = split(times, t)}
{for (i=1; i<=n; i++) if (index($1, t[i]) == 1) {print; break}}
' test_data.txt
答え2
いくつかの基盤@glennjacmanのコード- 目標時間に基づいてハッシュテーブルを作成し、効率のために入力値のハッシュルックアップを使用できます。
awk -v times="20:20 20:22" '
BEGIN {
split(times, tmp)
for ( i in tmp ) {
t[tmp[i]]
}
FS = ":"
}
($1 FS $2) in t
' test_data.txt
20:20:20 test1
20:22:57 test7