![패턴과 일치하는 인접한 행 삭제](https://linux55.com/image/137003/%ED%8C%A8%ED%84%B4%EA%B3%BC%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%EC%9D%B8%EC%A0%91%ED%95%9C%20%ED%96%89%20%EC%82%AD%EC%A0%9C.png)
입력: 정렬된 줄이 있는 파일
출력: 모든 숫자를 제거하면 파일에 인접한 줄과 일치하는 "고유한" 줄이 포함됩니다.
예
입력하다
abbylove2007
abbylove2008
abbylove2012
AbbyLove2014
abby1994lover
abby2007lover
abbylovesaal2018
abbylovesbsb2003
산출
abbylove2007
abby1994lover
abbylove\d+ 및 abby\d+lover와 일치하는 인접한 행이 여러 개 있기 때문에 abbylove2007 및 abby1994lover가 남습니다.
답변1
$ awk '{ curr=$0; gsub("[0-9]","",curr) } curr != prev { prev=curr; prevfull=$0; flag=0; next } !flag { print prevfull; flag=1 }' test
abbylove2007
abby1994lover
먼저 현재 행에서 숫자를 제거합니다. 숫자를 제거한 후 이 결과가 이전 행과 다른 경우 이전 행을 이 행으로 업데이트하고 이전 행 전체를 기억하고 변수를 flag
0으로 설정한 후 다음 행을 계속합니다.
flag
이 변수는 이전 라인과 동일한 라인을 출력할 때 사용됩니다.첫 번째이 라인들.
이전 줄과 동일한 줄(번호 제거)의 경우 플래그가 설정되지 않은 경우 전체 이전 줄을 인쇄한 다음 플래그를 설정합니다.
답변2
이는 다음과 같은 수정된 sed입니다 uniq -d
.
sed '$!N; s/^\([^0-9]*\)\(.*\)\n\1[0-9].*$/\1\2/; t; D'