발생 횟수를 찾은 다음 첫 번째 결과의 조각에서 다음 발생을 찾습니다.

발생 횟수를 찾은 다음 첫 번째 결과의 조각에서 다음 발생을 찾습니다.

나는 약간의 도움을 찾고 있으며 진행하면서 배우고 있습니다. 아래와 비슷한 것이 있습니다. 무슨 일이 일어나는지 보여주고 싶어"로그인"Log1에서"처리된 청구서"로그 1에. 검색값 사용 - 44. 솔직히 이건 제가 테스트 같은 것을 속이려고 하는 것처럼 보이지만 사실은 아닙니다. 저는 파일을 분해하고 배우기를 바라는 것이 처음입니다.

파일.txt

Log0 | 20191104 | 01 | Logged In - 55
Log1 | 20191104 | 04 | Logged In - 44
Log2 | 20191104 | 03 | Logged In - 33
Log1 | 20191104 | 02 | Received Bill
Log1 | 20191104 | 02 | Accepted Bill
Log2 | 20191104 | 05 | Logged Out - 33
Log1 | 20191104 | 33 | Processed Bill
Log0 | 20191104 | 44 | Broken Bill

원하는 출력을 찾으십시오.

Log1 | 20191104 | 04 | Logged In - 44
Log1 | 20191104 | 33 | Processed Bill

답변1

펄 솔루션:

perl -F'/\|/' -ne '$id = $F[0] if $F[3] =~ /- 44$/;
                   print if $F[0] eq $id && $F[3] =~ /Logged In|Processed Bill/;
                  ' -- file.txt
  • -n입력을 한 줄씩 읽습니다.
  • -F주어진 정규식의 각 입력 줄을 @F배열 로 분할합니다.
  • $F[3], 네 번째 열이 와 일치하면 - 44첫 번째 열이 에 저장됩니다 $id.
  • $id첫 번째 열이 같고 네 번째 열이 Logged In또는 와 일치하면 Processed Bill전체 행을 인쇄합니다.

답변2

실제로 @Choroba 솔루션과 매우 유사합니다.

awk -F'|'   '/Logged In/                   { login[$1]=$0}     
             /Processed Bill/ && login[$1] { print login[$1]; print}' ex1

어디:

  • /Logged In/ { login[$1]=$0}-- 열 1과 연관된 "로그인" 행을 저장합니다(예: "Log1").
  • /Processed Bil/ && login[$1] {print ...}-- 이전에 로그인한 "처리된 청구서"가 발견되면 인쇄합니다.

수정: 44만 인쇄합니다.

awk -F'|'   '/Logged In - 44/              { cod=$1; line=$0}     
             /Processed Bill/ && $1==cod   { print line "\n" $0}' file

답변3

Gnu sed가 확장 정규 표현식 모드인 경우:

$ sed -re ':a
    /Logged In - 44/!d
    $d;h;N
    /^(\S+)\s*\|.*\n\1\s*\|.*Processed Bill/b
    g;ba
' file

결과

Log1 | 20191104 | 04 | Logged In - 44
Log1 | 20191104 | 33 | Processed Bill

어떻게 작동하나요?

° Skip lines till we meet "Logged In 44"
° Pick up the nexr line and if it is "Processed Bill" AND first field matches with the logged in line, then it's a GO.
° Otherwise, discard the second portion and redo this process. 
° Assumption is that logged in 44 line is unique. 

관련 정보