파일 구조를 유지하면서 여러 json 파일에서 중복 줄을 제거합니다.

파일 구조를 유지하면서 여러 json 파일에서 중복 줄을 제거합니다.

수천 개의 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유효한 경우).

관련 정보