Awk

從多個 json 文件中刪除重複行,同時保留文件結構

  • January 17, 2017

我有一個包含數千個 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

並創建了一個包含所有文件中唯一行的大型單個文件,但這對我沒有用。我想保留現有的文件結構。感謝您的任何提示!

假設您的文件名沒有空格或特殊字元,這應該適合您。您可能需要調整第一個命令以獲得您想要的文件首先處理的排序順序。

#!/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}將新文件放置到位。

引用自:https://unix.stackexchange.com/questions/325434