awk를 사용하여 레코드 라이브러리의 이전 레코드를 삭제하고 싶나요?

awk를 사용하여 레코드 라이브러리의 이전 레코드를 삭제하고 싶나요?

CSV 파일 입력:

I,TEST1
H,TEST2
H,TEST3
I,TEST4
I,TEST5
H,TEST6
I,TEST7

결과물 파일:

I,TEST1
H,TEST2
I,TEST4
I,TEST5
H,TEST6
I,TEST7

H유형 레코드 뒤에 여러 유형 레코드가 있는 경우에만 삭제합니다 I. 첫 번째 유형을 유지 H하고 나머지는 삭제합니다.

답변1

괜찮아 보이는데:

$ cat file1
I,TEST1
H,TEST2
H,TEST3
I,TEST4
I,TEST5
H,TEST6
H,TEST7
H,TEST9
I,TEST10
H,TEST11

$ awk -F"," '/^I/{print;f=1};/^H/ && f==1 && !seen[$1]++{print;seen[$1]=0;f=0}' file1
I,TEST1
H,TEST2
I,TEST4
I,TEST5
H,TEST6
I,TEST10
H,TEST11

답변2

$ awk -F, '($1 == "I" || $1 != p) && p = $1' file.csv
I,TEST1
H,TEST2
I,TEST4
I,TEST5
H,TEST6
I,TEST7
  • 행의 첫 번째 열이 인 경우 I변수 p("이전 페이지")가 해당 I행으로 설정되고 해당 행이 인쇄됩니다.
  • 첫 번째 열이아니요 I하지만 이전 것과는 다릅니다(즉, 그렇지 않습니다).반복하다 H) 그런 다음 p변수를 해당 변수로 설정 H하고 해당 행을 인쇄합니다.
  • 첫 번째 열이 가 아니고 I이전 첫 번째 열과 동일한 경우 해당 행은 무시됩니다.

이렇게 하면 첫 번째 열이 첫 번째 열인 행을 제외하고 첫 번째 열이 이전 첫 번째 열과 동일한 모든 행이 삭제됩니다 I.

p = $1할당을 조건으로 사용합니다 . 이를 실행하고 값이 0이 아닌 경우(주어진 질문의 예제 데이터의 모든 인스턴스에 해당) 현재 행을 인쇄하는 부작용이 있습니다.

p = $1첫 번째 열에 0이 포함되어 있으면 로 변경됩니다 ((p = $1) || 1).

관련 정보