예상되는

예상되는

두 번째 열에 날짜가 있는 데이터 파일이 있습니다.

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

하이픈 " -"은 임의의 텍스트 데이터를 나타내고, 점 " ..."은 더 많은 데이터 행을 나타내며, "*"는 동일한 열에 있는 임의의 텍스트를 나타냅니다. 내가 원하는 것은 두 번째 열 사이의 20210112데이터를 기반으로 하는 것입니다 20210219.

sed/grep두 가지 모두 다른 열의 비슷한 패턴을 찾기 때문에 이를 피하고 싶습니다 .

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

또한 관련되지 않은 다른 줄의 다른 텍스트와도 일치합니다. 따라서 AWK가 더 나은 후보라고 생각하지만 awk는 첫 번째 패턴의 첫 번째 일치와 두 번째 패턴의 첫 번째 일치 사이에만 인쇄한다는 것을 알았습니다.

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

하지만 모든 행을 두 번째 모드의 마지막 게임으로 가져오고 싶습니다.

예상되는

-;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

해당 줄을 무시 ...하고 모든 날짜가 $2의 오름차순이라고 가정하면(예제에 표시된 대로) 필요한 것은 다음과 같습니다.

$ awk -F';' '(20210112 <= $2) && ($2 <= 20210219)' file
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210219;-;-;-;
-;20210219;-;-;-;

또는 범위를 초과하면 종료되므로 더 효율적입니다.

$ awk -F';' '20210112 <= $2{f=1} $2 > 20210219{exit} f' file
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
...
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210219;-;-;-;
-;20210219;-;-;-;

위의 내용도 입력에 종료 날짜가 없으면 시작 날짜부터 파일 끝까지 인쇄하고, 시작 날짜가 없으면 파일보다 큰 첫 번째 날짜부터 인쇄한다고 가정합니다. 시작일부터 종료일까지 등

답변3

언제 결정하다마지막패턴 발생을 확인하려면 이전 줄을 기억하고 패턴이 더 이상 나타나지 않는다고 확신할 때만 출력해야 하는 경우가 많습니다.~ 할 것이다보이는.

이 작업을 수동으로 수행할 필요가 없도록 하려면 파일의 시작 부분을 자르고 되돌린 다음 파일의 새 시작 부분을 자르고 다시 되돌릴 수 있습니다.

awk -F\; '$2 == 20210112,0' | tac | awk -F\; '$2 == 20210219,0' | tac

답변4

에서 이를 수행할 수 있으며 awk약간 더 복잡한 접근 방식이 필요합니다. ==대신 을 사용한다는 점에 유의하세요 ~. 이는 일치 필드가 하위 문자열을 포함 20210112하거나 20210219하위 문자열인 상황(예 20210219123: )을 피하기 위한 것입니다.

$ awk -F';' '$2==20210112{a=1}; $2==20210219 && a{b=1} a && b && $2!=20210219{exit}; a ' datafile 
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
...
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210219;-;-;-;
-;20210219;-;-;-;

또는 더 자세하지만 이해하기 쉽습니다.

$ awk -F';' '{
              if($2==20210112){ a=1 }
              if($2==20210219 && a){ b=1 } 
              if(a && b && $2!=20210219){ exit }; 
              if(a){ print }
             }' datafile 

또는 수치 비교를 수행해 보세요.

awk -F';' '$2>=20210112 && $2<=20210219' datafile 

그런데 sed필요한 경우 다음과 같은 것을 계속 사용할 수 있습니다. 두 번째 필드에서만 일치하도록 패턴을 고정하기만 하면 됩니다.

$ sed -n '/^[^;]*;20210112/,/^[^;]*;20210219/p' datafile

이 경우 첫 번째 일치에서 중지되므로 유용하지 않지만 적어도 다른 필드에서는 일치하지 않습니다.

관련 정보