🔀 Compare Lists
TextSorter Compare Lists is a free online text cleaning utility that allows you to find unique items, common entries, and differences between two lists
Comparison Results
Enter items in both lists and click "Compare Lists" to see results
What You Actually Get From One Comparison
One click, four lists: Compare Lists sorts every line from both boxes into Only in A, Only in B, In Both, and All Unique, each with its own count, copy button, and download button.
maria@shop.com
devon@shop.com
priya@shop.com
liu@shop.comliu@shop.com
maria@shop.comPaste your first list into List A and your second into List B, one entry per line, then click Compare Lists. The tool reads both boxes, applies whichever options you have checked, and builds four separate result sets rather than one merged view. Only in A holds every line from List A whose value does not turn up anywhere in List B. Only in B is the mirror image: lines from List B that List A does not contain. In Both lists every value the two lists share. All Unique is the union of everything, each distinct value appearing once regardless of which list, or how many times within a list, it came from.
| Card | What lands there |
|---|---|
| Only in A | Present in List A, absent from List B |
| Only in B | Present in List B, absent from List A |
| In Both | Present in both lists, shown once |
| All Unique | Every distinct value from either list, combined and deduplicated |
Each of the four cards works on its own. The count in the header updates the moment you compare, and the Copy and Download buttons underneath act only on that card's own list, so you can pull just the churned subscribers, or just the new signups, without touching the other three results. Downloads land as plain text files named for the card, one item per line, ready to paste somewhere else or re-upload as a fresh list. The counts next to each card heading are worth watching on their own, even before you scroll down to read the lines themselves: a large Only in A count on a subscriber comparison tells you at a glance that a lot of people dropped off, and a large In Both count on an inventory comparison tells you the two systems mostly agree, before you read a single row.
Nothing leaves your browser. The comparison runs in JavaScript on the page itself. Whatever you paste, customer emails, internal SKUs, employee rosters, is never uploaded anywhere before the results appear.
Case Sensitive Decides Whether Apple and apple Are the Same Item
Case Sensitive is off by default. With it off, "Apple" and "apple" collapse into one entry in In Both. Check the box and they become two unmatched entries, one in Only in A and one in Only in B.
Apple
Bananaapple
CHERRY| Case Sensitive | Only in A | Only in B | In Both |
|---|---|---|---|
| Off (default) | Banana | CHERRY | Apple |
| On | Apple, Banana | apple, CHERRY | nothing |
With Case Sensitive off, the tool lowercases every line before comparing it, so "Apple", "apple", and "APPLE" all reduce to the same comparison key. That key decides which column a line lands in, but the text you actually see in the results is not the lowercased version. It is the exact original text from whichever list built the match first. In the example above, In Both shows "Apple" with a capital A, List A's spelling, even though the match came from List B's lowercase "apple". If your two lists disagree on capitalization for values you consider identical, the surviving spelling always favors List A.
Turn Case Sensitive on and that lowercasing step is skipped entirely. Every comparison becomes a strict, character-for-character check, so "Apple" and "apple" are now two distinct values that will never end up together in In Both, no matter how many times either one repeats in either list.
This is the setting most likely to make your results look wrong. Real-world exports rarely agree on capitalization. A CRM might store "john@example.com" while a spreadsheet stores "John@Example.com". With Case Sensitive off, the default, these match. Switch it on and get a comparison that unexpectedly shows almost nothing in In Both, and that setting is usually the reason.
Acme Inc and Acme Inc. Will Land in Different Columns
Matching is exact string comparison only. There is no fuzzy matching, no similarity scoring, and no punctuation normalization, so a trailing period is enough to send two otherwise identical lines to opposite columns.
Acme IncAcme Inc.Compare those two single-line lists and you get Only in A: "Acme Inc", Only in B: "Acme Inc.", and nothing at all in In Both. To a person reading both lists, these are obviously the same company. To the comparison, they are two different strings, because one ends in a period and the other does not. The same thing happens with "Acme Incorporated" versus "Acme Inc", "123 Main St" versus "123 Main Street", or a name with a middle initial on one side and without it on the other. None of these are bugs. The tool never tries to guess that two values probably mean the same thing; it only checks whether they are, character for character, the same thing.
This is worth stating plainly because it is the single most common reason someone assumes the tool made a mistake. If a value you expected to see in In Both instead shows up split between Only in A and Only in B, the near certain cause is a small textual difference between the two versions, not a comparison error. Extra punctuation, a different abbreviation, an extra internal space between words, or a typo in either list will all produce this result.
Before comparing, standardize what you can. If your source data uses inconsistent formatting, such as some rows with "Inc." and others with "Inc", find and replace the inconsistent version in one list before pasting, or run both lists through a formatter first. The comparison itself has no setting that will do this for you.
A Name Repeated Three Times in One List Still Counts Once
Duplicates inside a single list never inflate a result. Before anything else happens, each list is reduced to its unique values, so "apple" appearing five times in List A is treated exactly the same as "apple" appearing once.
apple
apple
bananaapple
cherryCompare that pair and In Both contains "apple" exactly one time, not two, even though List A had two copies of it. Only in A holds just "banana". Only in B holds just "cherry". All Unique holds all three distinct values, "apple", "banana", "cherry", once each. The tool builds a unique set of comparison keys from each list before it ever checks one list against the other, so repeated lines within a single list collapse down to one entry ahead of any comparing. This also means the count shown for Only in A, Only in B, In Both, and All Unique always reflects distinct values, never raw line counts. If you need to know how many times a value repeats within one list on its own, this tool will not tell you that; it only tells you which distinct values exist and where they overlap.
The same collapsing rule explains what happens when a value is spelled two different ways with Case Sensitive off. If List A has both "APPLE" and "apple" as separate lines, they collapse into a single entry inside List A's own set before the two lists are ever compared against each other, and the surviving spelling is whichever occurrence appeared first in List A, reading top to bottom.
Worth knowing if you are checking for internal duplicates: this tool answers "what is different or shared between two lists," not "what repeats inside one list." For finding repeated entries within a single list, use the dedicated Remove Duplicates tool instead.
Trim Whitespace and Ignore Empty Lines Are Options, Not Guarantees
Both are checked by default, but either can be switched off. Turn Trim Whitespace off and a stray trailing space becomes part of the comparison. Turn Ignore Empty Lines off and blank rows show up in your results as empty entries.
apple
bananaapple
bananaWith Trim Whitespace checked, its default state, every line from both lists has leading and trailing spaces stripped before any comparing happens, so the trailing spaces after "apple" in the example above are removed and both lists match cleanly: In Both ends up with "apple" and "banana", nothing in either Only column. Uncheck Trim Whitespace and those trailing spaces become part of the line's identity. "apple" followed by two invisible spaces is no longer equal to "apple" with none, so it moves to Only in A while List B's clean "apple" moves to Only in B, and a comparison that should have matched perfectly shows two unexplained mismatches instead.
Ignore Empty Lines works independently and runs after trimming. With it checked, its default state, any line that ends up empty, whether it started empty or became empty after trimming stripped away nothing but spaces, is dropped from the working list entirely before comparing starts. Uncheck it and a blank line is treated as a real value, an empty string, which can then match other blank lines across your two lists and show up as an entry in your results with nothing visible in it. If you ever see what looks like a blank row in Only in A, Only in B, or In Both, this setting is why.
Because trimming happens before the empty line filter, a line made of nothing but spaces or tabs becomes an empty string once trimmed, and Ignore Empty Lines then removes it along with the genuinely blank lines. Turn Trim Whitespace off while leaving Ignore Empty Lines on, though, and that same whitespace only line survives, since it is not exactly empty; it is a string of spaces, and only an exact empty string gets filtered out.
Pasting from a spreadsheet or a PDF is the usual source of this problem. Cells copied from Excel or Google Sheets frequently carry an invisible trailing space, and text copied out of a PDF table can carry leading spaces too. If a result looks wrong and you cannot see why, check that Trim Whitespace is on before assuming the two lists genuinely differ.
Visual Diff Lines Up Rows by Position, Not by Match
Visual Diff is a side-by-side view, not a realignment. Row 1 of List A always sits beside row 1 of List B, row 2 beside row 2, and so on; each line is colored by whether its value exists anywhere in the other list, not by whether the line next to it is actually the same value.
apple
apple
bananaapple
apple
bananaClick Visual Diff after running a comparison and a two column view opens beneath the results, one column per list, with a colored left border on every row: a red border for a line found only in List A, a green border for a line found only in List B, and no border, just a neutral background, for a line whose value exists in both lists. That much matches the four result cards. Where Visual Diff differs is what it counts as one row. The four cards work from each list's deduplicated set of unique values, so a repeated line only ever appears once. Visual Diff works from the raw, non deduplicated list, in the exact order you typed or pasted it, which is why the two apple lines both survive into the column above. Both rows are marked as being in both lists, even though the In Both card itself lists "apple" only one time.
The row pairing is positional, not a computed alignment. List A's third line sits next to List B's third line purely because they share a row number, not because the tool determined they correspond to each other. If List A has ten lines and List B has seven, the last three rows of column A pair with empty cells rather than being pushed up to align with a matching row further down. This makes Visual Diff most useful for spotting where and how the two lists diverge in their raw order, such as confirming that a line by line export still lines up, rather than for counting exactly how many values are shared, which is what the In Both card is for.
Visual Diff also needs a completed comparison before it has anything to show. Open it before clicking Compare Lists and you get a placeholder message asking you to run the comparison first, rather than an empty diff.
Four Jobs This Comparison Actually Solves
Checking a mailing list against a suppression list
Paste your active subscriber list into List A and your unsubscribe or bounce list into List B. Only in A is exactly who is safe to email: subscribers who have not unsubscribed or bounced. In Both is your problem list, addresses that are still in your active file but should have been removed. Downloading Only in A directly gives you a clean send list without editing anything by hand.
Reconciling two exports of the same data
When a CRM export and a billing system export are both supposed to represent the same set of customers, paste one into each side. In Both confirms records both systems agree on. Only in A and Only in B are the discrepancies, customers one system knows about that the other does not, which is usually exactly what a reconciliation is trying to surface.
Diffing SKUs or inventory between two systems
A warehouse management system and a point of sale system frequently drift apart on which SKUs actually exist. List A as the warehouse export and List B as the point of sale export turns Only in A into stock the register does not know how to sell, and Only in B into SKUs the register can ring up that the warehouse has no record of, both worth investigating on their own.
Finding what changed between two versions of a list
Paste the old version of a list into List A and the current version into List B. Only in B is everything that got added since the old version. Only in A is everything that got removed. This works well for tracking changes to a roster, a product catalog, or any list you maintain over time, with one important limit: the comparison has no concept of a line being edited. If a single entry's text changed even slightly between versions, say a product name was corrected or a job title was updated, it will not show up as one modified row. It will show up as two separate results, the old text in Only in A and the new text in Only in B, because the tool compares exact text, not row identity.
Keep a stable identifier in view if you can. When comparing list versions where individual entries might get edited rather than only added or removed, include an ID, SKU, or email address as part of each line alongside the changing text. That way an edited row is still recognizable as the same thing with a changed detail instead of registering as an unrelated addition and removal.
Frequently Asked Questions
🔒 100% Private & Secure
All list comparison happens locally in your browser-your data is never uploaded. Safe for sensitive customer lists, confidential data, or proprietary information.