부분적으로 중복된 행 찾기 및 삭제

부분적으로 중복된 행 찾기 및 삭제
https://www.domain.com/files/G5SPNDOF/AAA-1080p.mp4.html
https://www.domain2.com/dl/G5SPNDOF/JHCGTS/AAA-1080p.mp4.html
https://www.domain.com/files/ZQWL80BG/AAA-1080p.mp4.html
https://www.domain.com/files/SVSRS0AD/BBB-1080p.mp4.html
https://www.domain.com/files/UCIONEMA/BBB-1080p.mp4.html

위의 줄이 포함된 파일이 있는 경우 중복된 파일이 있지만 전체 링크가 다른 파일을 제거하려면 어떻게 해야 합니까?

https://www.domain.com/files/G5SPNDOF/AAA-1080p.mp4.html
https://www.domain.com/files/SVSRS0AD/BBB-1080p.mp4.html

답변1

awk 사용:

awk -F'/' '!seen[$NF]++' file

정렬을 사용하여 이 작업을 수행할 수도 있습니다. 파일에 변경된 필드가 많이 포함되어 있으므로 먼저 반전해야 합니다.

rev file | sort -u -t/ -k1,1 | rev

답변2

any를 사용하면 sed"알려진 모든 파일 이름을 예약된 공간에 저장"하는 게으른 접근 방식을 선택할 수 있습니다.

sed 'G;\_/\(.*\)\n.*\1_d;P;s_.*/__;h;d' file
  • G패턴 공간에 예약된 공간(알려진 모든 파일 이름 포함)을 추가합니다.
  • 패턴은 수집된 파일 이름( )에서 반복되는 /\(.*\)\n.*\1개행 문자 사이에 파일 이름을 맞춥니다 . 이 경우 이를 제거하고 출력하지 않고 공백을 변경하지 않습니다./\1d
  • 이 시점에서 우리는 새로운 단어를 찾았다는 것을 알고 있으므로 P예약된 공간을 추가하지 않고 해당 줄을 인쇄합니다.
  • s_.*/__새 경로 목록을 h이전 공간에 복사할 수 있도록 경로를 제거합니다. d추가 출력 억제

답변3

목록이 큰 경우 메모리에 있는 모든 파일 이름을 awk에 저장하지 마세요.

$ sort file | awk -F'/' '$NF != prev{print} {prev=$NF}'
https://www.domain.com/files/G5SPNDOF/AAA-1080p.mp4.html
https://www.domain.com/files/SVSRS0AD/BBB-1080p.mp4.html
https://www.domain.com/files/ZQWL80BG/AAA-1080p.mp4.html

그렇지 않으면 참조@MariusCuet의 awk 답변.

답변4

GNU를 사용하여 datamash원본 데이터의 접두사로 각 URL에 기본 이름(끝에 있는 파일 이름)을 추가한 다음 추가된 열별로 데이터를 그룹화하고 각 그룹에서 첫 번째 URL을 추출합니다. 그런 다음 cut파이프라인 끝에 추가된 필드를 제거합니다. 이것은 사람이 할 수 있는 일을 생각나게 한다슈워츠 변환.

$ datamash basename 1 cut 1 <file | datamash groupby 1 first 2 | cut -f 2
https://www.domain.com/files/G5SPNDOF/AAA-1080p.mp4.html
https://www.domain.com/files/SVSRS0AD/BBB-1080p.mp4.html

대신 얻을 수 있습니다마지막각 그룹의 URL:

$ datamash basename 1 cut 1 <file | datamash -s groupby 1 last 2 | cut -f 2
https://www.domain.com/files/ZQWL80BG/AAA-1080p.mp4.html
https://www.domain.com/files/UCIONEMA/BBB-1080p.mp4.html

...또는 임의의 것:

$ datamash basename 1 cut 1 <file | datamash -s groupby 1 rand 2 | cut -f 2
https://www.domain2.com/dl/G5SPNDOF/JHCGTS/AAA-1080p.mp4.html
https://www.domain.com/files/SVSRS0AD/BBB-1080p.mp4.html
$ datamash basename 1 cut 1 <file | datamash -s groupby 1 rand 2 | cut -f 2
https://www.domain.com/files/G5SPNDOF/AAA-1080p.mp4.html
https://www.domain.com/files/SVSRS0AD/BBB-1080p.mp4.html
$ datamash basename 1 cut 1 <file | datamash -s groupby 1 rand 2 | cut -f 2
https://www.domain.com/files/ZQWL80BG/AAA-1080p.mp4.html
https://www.domain.com/files/UCIONEMA/BBB-1080p.mp4.html

관련 정보