Предполагая, что в каждом файле нет дубликатов, вы можете
- Concat все файлы (
cat file1 file2 ... file5
)
- Подсчитайте, как часто появляется каждая строка (
sort | uniq -c
)
- И оставляйте только строки, которые появились менее пяти раз (
sed -En 's/^ *[1-4] //p'
)
sort file1 ... file5 | uniq -c | sed -En 's/^ *[1-4] //p'
Однако, если какой-то файл может содержать одну и ту же строку несколько раз, чем вам придется сначала удалить эти дубликаты.
f() { sort -u "$1"; }
sort <(f file1) ... <(f file5) | uniq -c | sed -En 's/^ *[1-4] //p'
или (немного медленнее, но проще для редактирования)
for i in file1 ... file5; do sort -u "$i"; done |
sort | uniq -c | sed -En 's/^ *[1-4] //p'
Если по какой-то причине вы хотите сохранить дубликаты из отдельных файлов, а также хотите сохранить исходный порядок строк, то вы можете инвертировать указанную выше команду только для печати строк, которые появились в каждом файле, и удалить эти строки с помощью grep
:
f() { sort -u "$1"; }
grep -Fxvhf <(sort <(f file1) ... <(f file5) |
uniq -c | sed -En 's/^ *5 //p') file1 ... file5
или (немного медленнее, но проще для редактирования)
files=(file1 ... file5)
grep -Fxvhf <(for i in "${files[@]}"; do sort -u "$i"; done |
sort | uniq -c | sed -En 's/^ *5 //p') "${files[@]}"