从多个 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如果有效)。

相关内容