나는 약간의 도움을 찾고 있으며 진행하면서 배우고 있습니다. 아래와 비슷한 것이 있습니다. 무슨 일이 일어나는지 보여주고 싶어"로그인"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.