重複行削除ツール
テキストから重複行を削除し、ユニークな行だけを保持します
入力行
ユニークな行
重複行削除とは?
重複行削除とは、テキストブロックを1行ずつスキャンし、各ユニーク行の最初の出現のみを保持するプロセスです。オンラインで重複行を削除する際、ツールは入力を改行文字で分割し、Set のようなハッシュベースのデータ構造を使って既出行を追跡し、初めて現れた行だけを出力します。元の行順は保持されます。
2つの行が重複と見なされるのは、文字単位で完全に一致する場合です。ただし、実際のデータが完全一致に協力してくれることはほとんどありません。先頭・末尾の空白、一貫性のない大文字・小文字の使い方、タブやキャリッジリターンなどの不可視文字により、見た目が同じでも別の行として扱われることがあります。そのため、多くの重複削除ツールでは比較前の大文字・小文字の統一と空白のトリミングのオプションが提供されています。
重複削除はソートとは異なる操作です。Unix コマンド sort -u はソートと重複削除を同時に行うため、行の順序が変わります。元の行順を保持する必要がある場合は seen-set アプローチが必要です。行を順番に反復処理し、各行の正規化した形式をセットに追加し、キーが既に存在する行はスキップします。このツールは seen-set 方式を使用するため、最初に現れた行は元の位置に留まります。
この重複削除ツールを使う理由
テキストを貼り付け、比較オプションを選択するだけで、重複を削除した結果がすぐに確認できます。コマンドラインの設定も、正規表現の記述も、ファイルのアップロードも不要です。
重複行削除ツールの使用例
重複削除方式の比較
重複行を削除するアプローチには複数あり、行順の保持、メモリ使用量、精度のトレードオフがそれぞれ異なります。
| 方式 | 仕組み | 出力順 | 使用場面 |
|---|---|---|---|
| Set | Hash-based, O(1) lookup | Unordered | JavaScript Set, Python set() |
| Sorted + scan | Sort then skip adjacent | Sorted output | Unix sort -u, C++ std::unique |
| Seen-set + list | Track seen, preserve order | Original order | This tool, Python dict.fromkeys() |
| Bloom filter | Probabilistic membership | May miss some | Large-scale pipelines, Redis |
| SQL DISTINCT | Database-level dedup | Query-dependent | SELECT DISTINCT col FROM table |
大文字・小文字の区別と空白の処理
このツールが2行を重複と判断するかどうかは、2つのオプションによって制御されます。各オプションの使い方を理解することで、誤検知(異なる行を重複と扱う)と見落とし(一致すべき行を見逃す)の両方を防げます。
コード例
JavaScript、Python、Go、コマンドラインで重複行をプログラムで削除します。各例では行順を保持した重複削除を示し、大文字・小文字の区別に対応しています。
const text = `apple
banana
apple
Cherry
banana
cherry`
// Remove exact duplicates, preserve order
const unique = [...new Map(
text.split('\n').map(line => [line, line])
).values()].join('\n')
// → "apple\nbanana\nCherry\ncherry"
// Case-insensitive deduplication
const seen = new Set()
const ciUnique = text.split('\n').filter(line => {
const key = line.toLowerCase()
if (seen.has(key)) return false
seen.add(key)
return true
}).join('\n')
// → "apple\nbanana\nCherry"
// Trim whitespace before comparing
const trimDedup = text.split('\n').filter(line => {
const key = line.trim().toLowerCase()
if (seen.has(key)) return false
seen.add(key)
return true
}).join('\n')text = """apple
banana
apple
Cherry
banana
cherry"""
lines = text.splitlines()
# Remove duplicates, preserve order (Python 3.7+)
unique = list(dict.fromkeys(lines))
# → ['apple', 'banana', 'Cherry', 'cherry']
# Case-insensitive deduplication
seen = set()
ci_unique = []
for line in lines:
key = line.lower()
if key not in seen:
seen.add(key)
ci_unique.append(line)
# → ['apple', 'banana', 'Cherry']
# With whitespace trimming
seen = set()
trimmed = []
for line in lines:
key = line.strip().lower()
if key not in seen:
seen.add(key)
trimmed.append(line)package main
import (
"fmt"
"strings"
)
func removeDuplicates(text string) string {
lines := strings.Split(text, "\n")
seen := make(map[string]bool)
result := make([]string, 0, len(lines))
for _, line := range lines {
if !seen[line] {
seen[line] = true
result = append(result, line)
}
}
return strings.Join(result, "\n")
}
func main() {
text := "apple\nbanana\napple\ncherry\nbanana"
fmt.Println(removeDuplicates(text))
// → apple\nbanana\ncherry
}# Remove duplicates (sorts output — does not preserve order)
sort -u file.txt
# Remove duplicates while preserving original order
awk '!seen[$0]++' file.txt
# Case-insensitive dedup, preserve order
awk 'BEGIN{IGNORECASE=1} !seen[tolower($0)]++' file.txt
# Trim whitespace then dedup
sed 's/^[[:space:]]*//;s/[[:space:]]*$//' file.txt | awk '!seen[$0]++'
# Count duplicates before removing
sort file.txt | uniq -c | sort -rn