#!/usr/bin/env bash
set -euo pipefail
if [[ $# -ne 2 ]]; then
echo "Usage: $0 <file_a> <file_b>" >&2
exit 1
fi
FILE_A="$1"
FILE_B="$2"
[[ -f "$FILE_A" ]] || {
echo "Error: file not found: $FILE_A" >&2
exit 1
}
[[ -f "$FILE_B" ]] || {
echo "Error: file not found: $FILE_B" >&2
exit 1
}
TEMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TEMP_DIR"' EXIT
SORTED_A="$TEMP_DIR/a.sorted"
SORTED_B="$TEMP_DIR/b.sorted"
ONLY_A="$TEMP_DIR/only-a"
ONLY_B="$TEMP_DIR/only-b"
normalize_file() {
local input_file="$1"
local output_file="$2"
sed '
s/^[[:space:]]*//
s/[[:space:]]*$//
/^[[:space:]]*$/d
' "$input_file" |
LC_ALL=C sort -u > "$output_file"
}
normalize_file "$FILE_A" "$SORTED_A"
normalize_file "$FILE_B" "$SORTED_B"
LC_ALL=C comm -23 "$SORTED_A" "$SORTED_B" > "$ONLY_A"
LC_ALL=C comm -13 "$SORTED_A" "$SORTED_B" > "$ONLY_B"
echo "Only in A ($FILE_A):"
if [[ -s "$ONLY_A" ]]; then
cat "$ONLY_A"
else
echo "(none)"
fi
echo
echo "Only in B ($FILE_B):"
if [[ -s "$ONLY_B" ]]; then
cat "$ONLY_B"
else
echo "(none)"
fi
echo
echo "Summary:"
echo "Only in A: $(wc -l < "$ONLY_A")"
echo "Only in B: $(wc -l < "$ONLY_B")"
if [[ ! -s "$ONLY_A" && ! -s "$ONLY_B" ]]; then
echo "The files contain the same set of OIDs."
fi