여러 파일에서 중복된 줄을 제거하는 방법에 대한 질문이 있으며 여기에 유용한 스크립트를 제공했습니다.파일 구조를 유지하면서 여러 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
. 제대로 작동한다고 생각되면 주석을 제거하십시오.