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)
.