予想される

予想される

2番目の列に日付を含むデータファイルがあります。

# cat datafile
-;20210106;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
...
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210219;-;-;-;
-;20210219;-;-;-;
-;20210221;-;-;*20210219*;

ハイフン-はランダムなテキストデータを表し、ドット...はより多くのデータ行を表し、*は同じ列のランダムテキストを表します。私が望むのは、2番目の列間の20210112データに基づいていることです20210219

sed/grepどちらも他の列の同様のパターンを見つけるので、これを避けたいと思います。

# sed -n '/20210112/,/20210219/p' datafile
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
...
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210219;-;-;-;
-;20210219;-;-;-;
-;20210221;-;-;*20210219*;

また、関連していない他の行の他のテキストとも一致します。したがって、AWKはより良い候補だと思いますが、awkは最初のパターンの最初の一致と2番目のパターンの最初の一致の間にのみ印刷することがわかりました。

# awk -F';' '$2 ~ /20210112/,$2 ~ /20210219/' datafile
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
...
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210219;-;-;-;

しかし、すべての行を2番目のモードの最後のゲームにインポートしたいと思います。

予想される

-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
...
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210219;-;-;-;
-;20210219;-;-;-;

ベストアンサー1

これが私がする方法です:

BEGIN {FS = ";"}

$2 == 20210112 {capture = 1}
capture == 1   {buffer = buffer $0 "\n"}
$2 == 20210219 {printf ("%s", buffer); buffer = ""}

最初のパターンが最初に表示されることを確認したら、バッファに行を挿入し始めます。 2番目のパターンが現れるたびにバッファを印刷し、バッファを空の文字列にリセットします。

おすすめ記事