파일에서 중복된 줄을 찾아 파일 이름을 사용하여 출력하고 전체 디렉터리에 대해 이 작업을 수행하려면 어떻게 해야 합니까?

파일에서 중복된 줄을 찾아 파일 이름을 사용하여 출력하고 전체 디렉터리에 대해 이 작업을 수행하려면 어떻게 해야 합니까?

한 디렉터리에 여러 개의 파일이 있고 각 파일에서 중복된 줄을 찾아 파일 이름을 표시하여 중복된 파일을 식별해야 합니다.

나는 시도했다:for i in *.*;do sort $i | uniq -d ; done

중복된 줄이 표시되지만 파일 이름을 표시하고 중복된 파일을 식별하려면 어떻게 해야 합니까?

위 명령은 csv, .txt 파일에만 작동합니다. .xlsx 파일을 확인하는 다른 방법이 있습니까?

답변1

  1. sed- 에 이미 있는 접두사를 사용하여 각 줄에 접두사를 추가 할 수 있습니다 $i.

이렇게 하면 트릭을 수행할 수 있습니다.

for i in *.*; do sort $i|uniq -d |sed -e "s/^/$i:/"; done

더 쉽게 읽을 수 있도록 확장됨:

for i in *.*; do
  sort $i | uniq -d | sed -e "s/^/$i:/";
done
  1. xlsx 파일은 실제로 파일의 zip 디렉터리이므로 xlsx의 압축을 풀고 .xlsx 아래의 내용을 볼 수 있습니다 file/xl/worksheets/sheet1.xml. 그러나 이러한 파일은 xml 형식이므로 처리하기 전에 구문 분석이 필요합니다.

답변2

중복된 줄이 있는 파일을 찾는 옵션입니다.
빈 줄도 패턴과 일치할 수 있습니다.

awk 'D[$0]++ {print FILENAME; nextfile}' *.*

빈 행을 제외하려면 다음과 같은 다른 필터를 추가해야 합니다.

awk '/./ && D[$0]++ {print FILENAME; nextfile}' *.*

따라서 공백 문자가 있는 줄을 제외할 수 있습니다.

gawk '/\S/ && D[$0]++ {print FILENAME; nextfile}' *.*

다음은 귀하의 작업에 대한 답변입니다(공백 및 빈 줄 없음).

awk 'FNR == 1 {delete D;j=0} /[^[:blank:]]/ && (D[$0]++ == 1) {if(! j++ ) print "name: " FILENAME; print}' *.*

관련 정보