두 파일 사이의 중복된 줄을 찾고 싶을 때 이 명령을 사용합니다.
comm -12 <(sort file1.txt) <(sort file2.txt)
또는
sort file1.txt file2.txt | awk 'dup[$0]++ == 1'
하지만 폴더 내의 여러 파일에서 중복된 줄을 어떻게 찾을 수 있습니까? 예:
mainfolder
folder1
file1-1.txt
file1-2.txt
etc
folder2
file2-1.txt
file2-2.txt
etc
그리고 터미널의 결과는 파일별로 표시됩니다(즉, 모든 파일에서 해당 줄이 반복되지만 이를 포함하는 파일이 지정됨). 문제의 원인을 이해할 수 있습니다.
PD: 노력했어요이 명령이건 나한테는 안 맞는다
file_expr="*.txt"; sort $file_expr | sed 's/^\s*//; s/\s*$//; /^\s*$/d' | uniq -d | while read dup_line; do grep -Hn "^\s*$dup_line\s*$" $file_expr; done| sort -t: -k3 -k1,2 | awk -F: '{ file=$1; line=$2; $1=$2=""; gsub(/(^[ \t]+)|([ \t]+$)/,"",$0); if (prev != "" && prev != $0) printf ("\n"); printf ("\033[0;33m%s (line %s)\033[0m: %s\n", file, line, $0); prev=$0; }'
답변1
다음과 같이 할 수 있습니다(파일 이름에 탭 문자가 없는 경우).
grep -T -r . mainfolder | sort -k 2 | uniq -D -f 1
재귀는 grep
포함된 파일 이름이 앞에 붙은 각 줄을 출력합니다. 그런 다음 첫 번째 필드를 제외한 모든 필드를 기준으로 정렬합니다. 마지막으로 uniq
첫 번째 필드를 건너뛰고 중복 행만 출력됩니다.
find
--include
, 또는 및 플래그(예: )를 사용하여 정렬되는 파일을 더 효과적으로 제어 할 수 있습니다 --exclude
grep
.