1

テストファイル

cat text.txt 
09:00:00 TESTING
09:00:01 TESTING
09:00:02 TESTING
09:00:03 TESTING
09:00:04 TESTING
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
09:02:01 TESTING
09:02:02 TESTING
09:02:03 TESTING
09:03:00 TESTING
09:03:01 TESTING
09:03:02 TESTING
09:03:03 TESTING

正常に動作する変数なしの実際のパターン検索:

cat ./text.txt|awk -v start="09:01" -v end="09:02" '/09:01/,/09:02/' text.txt
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING

失敗する変数を使用したパターン検索

awk -v start="09:01" -v end="09:02" '/start/,/end/' text.txt

それを機能させるシェルエコーを使用して変数をラップする厄介なハック

echo "awk -v start="09:01" -v end="09:02" '/$start/,/$end/' text.txt"
awk -v start=09:01 -v end=09:02 '/09:01/,/09:02/' text.txt

start="09:01"; end="09:02"; echo "awk -v start="09:01" -v end="09:02 text.txt" '/$start/,/$end/'"|/bin/sh
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING

私が間違っていること、またはこれが awk の可能な機能であるかどうかについてのアイデアはありますか?

提案は機能し、結果にいくつかの違いがありました:

1.

awk -v start="09:01" -v end="09:02" '$0~start,$0~end' text.txt
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING

2.

awk -v start="09:01" -v end="09:02" 'match($0,start),match($0,end)' text.txt
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING

3.

awk -v start="09:01" -v end="09:02" '$0~start{print}$0~end{print}' text.txt
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
09:02:01 TESTING
09:02:02 TESTING
09:02:03 TESTING

4.

awk -v start="09:01" -v end="09:02"  '$1~start||$1~end' text.txt
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
09:02:01 TESTING
09:02:02 TESTING
09:02:03 TESTING

3 と 4 は完全な結果を返し、上位 2 つはパターンにヒットするとすぐに停止します

4

4 に答える 4

5

変数を行頭に固定する必要があります。

awk -v start="09:01" -v end="09:02" '$0~"^"start,$0~"^"end' text.txt

09:02 は 09:02:01 と一致しますが、17:09:02 とは一致しません。

個人的には、この範囲のものは使用しませんが、代わりにフラグを設定/クリア/テストするだけで、より拡張性が高くなります。たとえば、これらのそれぞれを試して、区切り行の印刷を操作するのがどれほど簡単かを確認してください。

awk -v start="09:01" -v end="09:02" '$0~"^"start{f=1} f; $0~"^"end{f=0}' text.txt
awk -v start="09:01" -v end="09:02" 'f; $0~"^"start{f=1} $0~"^"end{f=0}' text.txt
awk -v start="09:01" -v end="09:02" '$0~"^"start{f=1} $0~"^"end{f=0} f;' text.txt
awk -v start="09:01" -v end="09:02" '$0~"^"end{f=0} f; $0~"^"start{f=1}' text.txt

最初の時間で停止するのではなく、09:02時間のすべてを取得したいという@sudo_Osの回答を受け入れていることがわかります。その場合は、RE 比較の代わりに文字列を使用してください。

$ awk -v start="09:01" -v end="09:02" '$1>=start":00" && $1<=end":59"' file
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
09:02:01 TESTING
09:02:02 TESTING
09:02:03 TESTING

または、これは同じ結果になります:

$ awk -F: -v start="09:01" -v end="09:02" '$1FS$2>=start && $1FS$2<=end' file
于 2013-02-08T14:59:56.800 に答える
3

一致するべきではありません:

$ awk -F: -v hour=9 -v start=1 -v end=2 '$1==hour && $2>=start && $2<=end' file
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
09:02:01 TESTING
09:02:02 TESTING
09:02:03 TESTING

すべての09:02:XX行が必要ではありませんか?

于 2013-02-08T11:31:58.260 に答える
2

start と end をパターンとして使用するには、次の~演算子を使用して awk に明示的に伝えることができます。

awk -v start="09:01" -v end="09:02" '$0 ~ start,$0 ~ end'

またはmatch()

awk -v start="09:01" -v end="09:02" 'match($0,start),match($0,end)'
于 2013-02-08T11:28:16.033 に答える
1
awk -v start="09:01" -v end="09:02" 'substr($0,1,5) >= start && substr($0,1,5) <= end' test.txt

これは、時間範囲が時間の先頭にまたがる場合に機能し、時間と分のみを調べます。$1 は使用されません。先頭に空白があるものの、それ以外は一致するものへの「ヒット」を避けるためです。

率直に言うと、BEGIN といくつかの引数を使用して開始/終了を設定します。とにかく、私にとっては、1行でたくさんのものを手に入れることができるので、そうしなければならないという意味ではありません.

使用したデータは次のとおりです。

09:00:00 TESTING
09:00:01 TESTING
09:00:02 TESTING
09:00:03 TESTING
09:00:04 TESTING
09:01:00 TESTING
09:01:01 TESTING
09:01:02 TESTING
09:01:03 TESTING
09:02:00 TESTING
09:02:01 TESTING
09:02:02 TESTING
09:02:03 TESTING
09:03:00 TESTING
09:03:01 TESTING
09:03:02 TESTING
09:03:03 TESTING
02:09:01 toasted
19:01:01 toasted
  09:01:01 toasted
20:00:00 toasted 09:01:01
于 2013-02-08T13:50:03.750 に答える