수천 개의 json 파일이 있는 폴더가 있습니다. 각 폴더의 내용은 다음과 같습니다.
file.1424-417982.json
file.1424-417995.json
file.1424-418013.json
file.1424-418015.json
(etc.)
일부 파일에는 폴더의 다른 파일과 중복되는 줄이 포함되어 있습니다. 예를 들어, 단일 라인
{"a":"fas8d\U0001f638f8gej3","b":527239835}
에서 발생할 수 있습니다
file.1424-417982.json
file.1424-418013.json
아니면 다른 파일에 있습니다.
모든 파일을 반복하고 파일에서 어떤 줄이 반복되는지 기록한 다음 파일에서 모든 항목을 제거(첫 번째 항목은 그대로 유지)하는 스크립트를 실행하고 싶습니다.
나는 노력했다
sort -u *.json > newfile
그리고 모든 파일에 고유한 줄이 포함된 거대한 단일 파일을 만들었지만 이 방법은 제게는 효과가 없었습니다. 기존 파일 구조를 유지하고 싶습니다. 어떤 팁이라도 감사드립니다!
답변1
파일 이름에 공백이나 특수 문자가 없다고 가정하면 이 방법이 적합할 것입니다. 먼저 처리되는 파일의 원하는 정렬 순서를 얻으려면 첫 번째 명령을 조정해야 할 수도 있습니다.
#!/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
설명하다
temp=$(mktemp)
사용할 tmp 파일을 만듭니다.for file_to_dedupe in $(echo *.json|sort)
중복된 파일을 제거하려면 파일 반복을 시작하세요.for file_to_strip in *.json
중복을 제거하려면 파일을 반복하면서 시작하세요.[ "$file_to_dedupe" == "$file_to_strip" ] && continue
현재 파일을 건너뜁니다.grep -w -Ff ${file_to_dedupe} -v ${file_to_strip} > ${temp}
정확한 속임수를 제거하기 위해 각 라인을 패턴으로 사용file_to_dedupe
mv ${temp} ${file_to_strip}
새 파일을 제자리에 배치하십시오.
답변2
perl -i.bak -ne 'print $_ unless $a{$_}++ ' *.json
삭제합니다( files.bak
유효한 경우).