폴더의 여러 파일에서 중복된 줄 제거: 범위 내의 파일만 확인

폴더의 여러 파일에서 중복된 줄 제거: 범위 내의 파일만 확인

여러 파일에서 중복된 줄을 제거하는 방법에 대한 질문이 있으며 여기에 유용한 스크립트를 제공했습니다.파일 구조를 유지하면서 여러 JSON 파일에서 중복 행을 제거합니다..

문제는 내 폴더에 10000개의 파일이 있고 각 파일의 크기가 1.5MB라는 것입니다. 스크립트는 며칠 동안 실행되었지만 완료되지 않았습니다. 내 폴더는 다음과 같습니다.

file.1424-417982.json
file.1424-417995.json
file.1424-418013.json
file.1424-418015.json
file.1424-418019.json
file.1424-418027.json    
(9994 more files)

중복된 줄은 지정된 범위 내의 파일에서만 발생하는 것으로 확인되었습니다. 위의 처음 4개 파일에는 중복된 줄이 있을 수 있지만 이러한 줄은 폴더의 다른 파일에는 나타나지 않습니다. 마찬가지로 파일 2-5에는 중복이 있을 수 있지만 다른 파일에는 중복이 없을 수 있습니다. 4개 파일 범위에서 중복 항목만 찾도록 쉘/bash 스크립트를 수정하고 이 작업을 순서대로 거의 10000번 수행하여 범위를 1-4, 2-5, 3-6...9996-10000으로 변환하려면 어떻게 해야 합니까? ?

중복 항목을 찾기 위해 나에게 제공된 코드는 다음과 같습니다. 6개의 파일만 있는 테스트 폴더에서 테스트했는데 충분히 빨랐습니다.

#!/bin/bash
temp=$(mktemp)
for file_to_dedupe in $(echo *.json|sort)
do
   for file_to_strip in *.json
   do
      [ "$file_to_dedupe" == "$file_to_strip" ] && continue
      grep -w -Ff ${file_to_dedupe} -v ${file_to_strip} > ${temp}
      mv ${temp} ${file_to_strip}
   done
done

답변1

파일을 4x4로 반복하도록 스크립트를 수정했습니다. 약 20개의 파일에 대해 테스트한 결과 제대로 작동하는 것 같습니다. 이 스크립트는 파일 이름을 배열에 저장한 다음 4x4로 반복합니다.

    temp=$(mktemp)

    declare -a files=($(echo *.json|sort))
    length=$(echo ${#files[@]})

    for ((i=0;i<length;i++))
    do
      for ((j=0;j<=3;j++))
      do
        [ "${files[i]}" == "${files[i+j]}" ] && continue
        [ "$((i+j))" -ge "$length" ] && continue
        echo ${files[i]} ${files[i+j]}
        #grep -w -Ff ${files[i]} -v ${files[i+j]} > ${temp}
        #mv ${temp} ${files[i+j]}
      done
    done

나는 단지 여기에 출력하고 있습니다 echo. 제대로 작동한다고 생각되면 주석을 제거하십시오.

관련 정보