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番目のパターンが現れるたびにバッファを印刷し、バッファを空の文字列にリセットします。