List Compare

Find intersections and items unique to either side

Loading tool…

About List Compare Tool

List Compare Tool treats two pasted lists as sets of lines and splits them into three results: the items only in A, the items present in both, and the items only in B. Each result pane shows its own count and has its own copy button, so the output is ready to paste into the next step.

A list comparison is only as meaningful as the normalization applied before it. Two exports of the same data rarely agree on trailing spaces, capitalization, or whether a repeated row means anything. The four checkboxes above the panes decide all of that. State the question first — "which accounts exist in staging but not in production" — then set the options that make it answerable.

How to use this developer tool

  1. Paste one list into pane A and the other into pane B, one item per line.
  2. Set the four options deliberately. Trim whitespace and ignore blank lines are on by default; ignore case is off, and deduplicate is on.
  3. Run the comparison and read the three result panes: only A, the intersection, and only B, each with its item count in the pane heading.
  4. If a count surprises you, change one option at a time and re-run. The difference between two runs tells you exactly which normalization mattered.
  5. Copy the pane you need. The three outputs are plain newline-separated lists, so they paste straight back into a query, a ticket, or another tool.

Worked example: feature flags in two environments

List A is the flag set in staging, pasted from a console that indents some rows and repeats one. List B is production, exported with Windows line endings. The defaults are left as they are: trim whitespace on, ignore case off, ignore blank lines on, deduplicate on.

List A (staging) and List B (production)
A:
checkout_v2
dark_mode
  legacy_banner
search_rerank
Dark_Mode
checkout_v2

B:
checkout_v2
dark_mode
search_rerank
promo_bar
Results
Only A · 2
legacy_banner
Dark_Mode

Intersection · 3
checkout_v2
dark_mode
search_rerank

Only B · 1
promo_bar

Three of the defaults did real work here. Trimming turned " legacy_banner" into a comparable value, deduplication collapsed the repeated checkout_v2 so it is counted once, and the line splitter handled the Windows line endings in B without any option at all. Dark_Mode landed in "only A" because ignore case is off — which is correct for flag keys, and would be wrong for email addresses.

Why two identical-looking entries do not match

Lines are split on CRLF, CR, and LF, so mixed line endings never cause a mismatch. Everything else that makes an entry look identical while comparing unequal is below.

Hidden differenceRemoved by trim whitespace?What to do
Leading or trailing spaceYesLeave trim on
Non-breaking space U+00A0, from a web table or PDFAt the edges onlyReplace one in the middle before pasting
Ideographic space U+3000, from a CJK documentAt the edges onlySame as above
Byte order mark U+FEFF, from an Excel exportYesRe-export without a BOM to fix the source
Zero-width space U+200BNoIt is not whitespace to trim; strip it first
Capitalization, Dark_Mode against dark_modeNoTurn on ignore case for case-insensitive systems
Unicode NFC against NFD, as in caféNoNormalize both exports to NFC
Quotes or a comma left on the rowNoStrip the wrapper in the Text Workbench first

Troubleshooting

The intersection is empty even though both lists obviously overlap.

Why it happens One list was copied out of a query result or a spreadsheet and still carries its formatting: surrounding quotes, a trailing comma, a leading bullet, or a column separator. Every row differs by those characters, so nothing matches.

Fix Strip the wrapper before comparing. The Text Workbench can remove a literal prefix and suffix from every line in one pass; paste the cleaned list back here afterwards.

The three counts do not add up to the two input line counts.

Why it happens Deduplicate is on by default, so a value repeated in a list is counted once. Blank lines are also dropped before comparison.

Fix This is usually what you want for a membership question. Turn deduplicate off when you are checking whether a list contains duplicates at all, then compare the intersection count against the raw line count.

An item you know exists in both lists is reported as only in A.

Why it happens Case is significant by default, and so is every character inside the value. Dark_Mode and dark_mode are two different entries; so are api.example.com and API.example.com.

Fix Turn on ignore case when the upstream system is case-insensitive, such as email local parts, hostnames, or Windows paths. Leave it off for anything case-sensitive: S3 object keys, Linux paths, base64 values, and most identifiers.

The result says the lists are identical but you know one was reordered.

Why it happens This is a set comparison. Membership is all it reports; position and sequence are discarded before anything is compared.

Fix Use the Text Compare & Diff Checker when order carries meaning, for instance a route table, a migration sequence, or a CSV where the row number matters.

When this tool is the right choice

  • Finding which identifiers exist in one environment, tenant, or export and not in the other.
  • Checking a deployment list against an inventory before a migration, without writing a query.
  • Reconciling a list of expected files, flags, or permissions against what a system actually reports.
  • Deduplicating a single list: paste it into A, leave B empty, and the "only A" pane is the unique set.

When to use something else

  • Comparing two versions of the same ordered document. The Text Compare & Diff Checker preserves position and shows what moved.
  • Comparing records with several fields per row. Load the data into the JSON to Table Converter, or compare the field you actually key on rather than whole rows.
  • Counting how often each value occurs. The results are sets, not tallies; a grouping query or a spreadsheet pivot answers that properly.

Privacy and data handling

Both lists are split, normalized, and intersected in this browser tab; nothing is uploaded and nothing survives a reload. The material compared here is usually an export — user IDs, email addresses, order numbers — exactly the kind of data that should not be pasted into a public tool without thought. Compare a representative slice rather than a full export.

Related developer tools

Frequently asked questions

Does the tool care about Windows line endings?

No. Lines are split on CRLF, CR, or LF before anything else happens, so you can paste a file exported from Windows into one pane and a Unix one into the other without changing any option. Line endings are a real problem for diffing, but not here.

How do I deduplicate a single list?

Paste it into pane A, leave pane B empty, keep deduplicate on, and run the comparison. Everything ends up in the "only A" pane, with duplicates collapsed and blank lines removed, and the heading gives you the unique count.

Why is ignore case off by default?

Most things developers compare are case-sensitive: object keys, Linux paths, tokens, git refs, and flag names. Lowercasing them silently merges entries that a real system treats as distinct. Turning it on is a deliberate statement that the upstream system is case-insensitive.

Does deduplicate change which items appear, or only the counts?

Both. With deduplicate on, each distinct value appears once in whichever pane it belongs to. With it off, the only-A and intersection panes repeat a value as many times as it occurs in list A, and only-B does the same for list B.

Can I compare more than two lists?

Not in one pass. Compare A against B, copy the intersection, and compare that against the third list. For membership questions this chains correctly, because intersecting is associative.

The counts are right but the order of the results looks arbitrary. Why?

The result panes preserve the order of the list they came from: only-A and the intersection follow list A, and only-B follows list B. Nothing is sorted, so you can still recognize the original grouping. Sort the output in the Text Workbench if you need it alphabetical.