awk: 레코드를 패턴 일치로 설정한 다음 마지막 레코드만 인쇄합니다.

awk: 레코드를 패턴 일치로 설정한 다음 마지막 레코드만 인쇄합니다.

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변형된 솔루션과 동일하지만 변수 대신 예약된 공간을 사용하여 각 레코드에 대한 행을 누적합니다.

관련 정보