파일에서 "SET CURRENT"로 시작하고 동일한 첫 번째 줄을 공유하고 동일한 문장이있는 구문에서 중복 줄을 제거하고 싶습니다. 예를 들어 다른 단락에 속하는 중복 줄은 제거하지 않습니다.
다음 파일이있는 경우 :
SET CURRENT = 'aaa' ;
CREATE SYN file1 FOR 1000.file1 ;
CREATE SYN file2 FOR 1000.file2 ;
CREATE SYN file3 FOR 1001.file3 ;
CREATE SYN file3 FOR 1001.file3 ;
SET CURRENT = 'aaa' ;
CREATE SYN file1 FOR 1000.file1 ;
CREATE SYN file2 FOR 1000.file2 ;
CREATE SYN file7 FOR 1000.file7 ;
SET CURRENT = 'bbb' ;
CREATE SYN file5 FOR 1002.file5 ;
CREATE SYN file6 FOR 1003.file6 ;
SET CURRENT = 'bbb' ;
CREATE SYN file1 FOR 1000.file1 ;
CREATE SYN file8 FOR 1002.file8 ;
CREATE SYN file6 FOR 1003.file6 ;
결과는 다음과 같습니다
SET CURRENT = 'aaa' ;
CREATE SYN file1 FOR 1000.file1 ;
CREATE SYN file2 FOR 1000.file2 ;
CREATE SYN file3 FOR 1001.file3 ;
SET CURRENT = 'aaa' ;
CREATE SYN file7 FOR 1000.file7 ;
SET CURRENT = 'bbb' ;
CREATE SYN file5 FOR 1002.file5 ;
CREATE SYN file6 FOR 1003.file6 ;
SET CURRENT = 'bbb' ;
CREATE SYN file1 FOR 1000.file1 ;
CREATE SYN file8 FOR 1002.file8 ;
awk를 사용하면 다음과 같이 할 수 있습니다.
awk 'NF==0{print;next};/^SET CURRENT/{c=$4;print;next}!seen[c,$0]++' file
더 읽기 쉽게 만들기 위해 몇 가지 주석이 있습니다.
awk ' NF == 0 { # If we find an empty line
print # print the line
next # and skip to the next record
}
/^SET CURRENT/{ # If we find a line beginning wiith "SET CURRENT"
c = $4 # Store the value in the 4th field
print # Print the current line
next # and skip to the next record
}
!seen[c,$0]++ # Print if the combination of the "c" value
# and the current line has not been stored
# in array "seen", and then store the
# combination in the array
# (in order to prevent other lines to be printed)
' file
다음 !seen[c,$0]++
과 같이 작동합니다. 배열 인덱스에서 쉼표를 사용하면 두 토큰이 SUBSEP
문자로 결합 된 단일 문자열로 결합됩니다 . 이 경우 c 문자와 현재 줄 ($ 0)의 조합을 인덱스로 사용합니다. 필터링 후에 고유해야하기 때문입니다. 로 !seen[c,$0]
우리 조합이 배열 인덱스로 존재하는지 확인합니다. 색인이 없으면 표현식이 true로 평가되어 행이 인쇄됩니다. 색인이 있으면 표현식이 거짓으로 평가되고 행이 인쇄되지 않습니다. post-fix 증분 연산자를 사용하여 인덱스의 발생 횟수를 계산하므로 행이 첫 번째 발생시에만 인쇄되고 후속 일치에는 인쇄되지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다