Краткий ответ: нет простого метода.В общем, любое решение должно сначала решить, как разбить входной документ на куски (предложения, наборы из 4 слов каждое и т. Д.), А затем сравнить их, чтобы найти дубликаты.Если важно, чтобы упорядочение элементов, не являющихся дубликатами, было одинаковым в выходных данных, как это было во входных данных, то это только усложняет ситуацию.
Самое простое дружественное к bash решение - разделить входные данные настроки, основанные на любых критериях, которые вы выбираете (например, разделить на каждом .
, хотя выполнение этой цитаты безопасно немного сложно), а затем использовать стандартные механизмы обнаружения дубликатов (например, | uniq -c | sort -n | sed -E -ne '/^[[:space:]]+1/!{s/^[[:space:]]+[0-9]+ //;p;}'
, а затем, для каждой результирующей строки, удалить текстиз ввода.
Если предположить, что у вас есть файл, который был правильно разделен на строки в «предложении», тогда
uniq -c lines_of_input_file | sort -n | sed -E -ne '/^[[:space:]]+1/!{s/^[[:space:]]+[0-9]+ //;p;}' | while IFS= read -r match ; do sed -i '' -e 's/'"$match"'//g' input_file ; done
Может быть достаточно. Конечно, он ужасно сломается, если $match
содержит любые данные, которые sed
интерпретирует как шаблон. Для выполнения фактической замены следует использовать другой механизм, если это представляет для вас проблему.
Примечание. Если вы используете GNU sed, -E
Переключатель выше должен быть изменен на -r