awk를 사용하여 패턴 일치 후 마지막 레코드만 출력하는 방법은 없습니다.
각 "기록"은 DATE로 시작하고 대시로 끝납니다.
나는 다음을 시도했지만 운이 없습니다.
awk '/02\/21\/19/,/---/; END{print}' sample.file
하지만 이것은 내가 기대했던 마지막 기록이 아닌 모든 기록을 제공할 뿐입니다.
샘플 데이터: 이 두 개의 완전한 레코드를 호출하겠습니다. 주어진 시간에 마지막 하나만 필요합니다.
02/21/19 14:00:00 - 15:00:00
Total:
ID Total Approved Rejected
All 1 0 ( 0%) 1 (100%)
Total By Consumer:
ID Total Approved Rejected
123 1 0 ( 0%) 1 (100%)
Total By Supply:
ID Total Approved Rejected
3878 1 0 ( 0%) 1 (100%)
--------------------------------------------------------
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
--------------------------------------------------------
또한 sed가 작동할 것이라고 생각했지만 여전히 오류가 발생합니다.
sed -n '/02\/21\/19/,/----/,$p'
sed: -e expression #1, char 20: unknown command: `,'
예상되는 출력은 마지막 레코드입니다.
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
어떤 아이디어가 있나요?
답변1
기록이 줄로 구분되어 ---
있고 제공된 날짜 중 마지막 날짜를 인쇄하려면 다음과 같이 사용할 수 있습니다.
awk -v RS='\n-+' -v d='02/21/19' '$1 == d {x = $0} END {print x}'
전임자.
$ awk -v RS='\n-+' -v d='02/21/19' '$1 == d {x = $0} END {print x}' data
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
GNU awk가 있고 레코드 구분 기호를 유지하려면 x = $0
다음으로 변경하십시오.x = $0 RT
답변2
명령에서 첫 번째 부분과 마지막 부분도 포함하는 패턴 일치 '/02/21/19를 지정하여 이 두 부분을 인쇄합니다.
다음 두 가지 방법을 시도했는데 훌륭하게 작동합니다.
method1: awk '/^02\/21\/19 15/,/-------/{print $0}' file.txt
method2:sed -n '/02\/21\/19 15/,/---/p' file.txt
output
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
--------------------------------------------------------
답변3
첫 번째 sed
명령은 거의 성공했지만 구문 오류가 있습니다. 마지막 부분을 원한다면 다음과 같이 할 수 있습니다.
sed -n '/02\/21\/19 15:00:00 - 16:00:00/,/190/p' file.txt
산출:
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
1) 모든 내용을 자동으로 인쇄하지 않도록 -n
지시합니다 .sed
2) 슬래시 안의 패턴이 일치해야 합니다. 날짜 자체가 파일의 다른 곳에 나타나기 때문에 데이터와 시간을 첫 번째 문자열로 함께 넣었으며, 샘플 데이터를 제공했기 때문에 시간도 나타날 수 있습니다. 그런 다음 나타나는 첫 번째 위치가 점선 바로 앞에 있으므로 190을 일치시킬 두 번째 패턴으로 만들었습니다.
답변4
입력 데이터의 마지막 레코드만 원한다고 가정해 보겠습니다.
$ awk '/\// { lines = $0; next } { lines = lines ORS $0 } END { print lines }' file
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
--------------------------------------------------------
그러면 변수에 입력 행이 누적됩니다 lines
. 일치하는 행이 발견될 때마다 /
(날짜가 포함된 행을 감지하는 매우 간단한 방법) 누적된 행이 지워지고 현재 행으로만 설정되며 다음 주기로 이동합니다. 마지막으로 현재 누적 행 수가 출력됩니다.
동등한 것을 사용하십시오 sed
:
$ sed -n '/\//{x;d;}; H; ${x;p;}' file
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
--------------------------------------------------------
이 단계별 방법은 awk
변형된 솔루션과 동일하지만 변수 대신 예약된 공간을 사용하여 각 레코드에 대한 행을 누적합니다.