Сравнение текстовых файлов в linux

Сегодня меня попросили сравнить заголовки небольших абзацев в двух больших текстовых файлах. Все заголовки начинались со звёздочки, поэтому проблем не возникло. Но совсем без проблем не интересно и больше от скуки, чем для реального пользования, захотелось найти способ для вытаскивания заголовков из любого текста. К сожалению 100% рабочий способ не был найден, однако в конце статьи будет интересное решение по превращению двойных и более пустых строк в одну пустую строку.

Для начала простейший вариант, когда надо просто сравнить 2 текстовых файла.
Для этого есть команда diff. Синтаксис следующий:

diff первый_файл второй_файл

Гораздо удобнее перенаправить вывод в файл с расширением diff

diff первый_файл второй_файл > profit.diff

Если такой файл открыть в текстовом редакторе, то будет подсвечен синтаксис и процесс анализа облегчится.

Программа сравнивает строки и если в одном из файлов присутствует строка, которой нет в другом, то ставится знак «>» или «

Чтобы получить вывод строк, которые начинаются с одного символа (в данном случае это *), то лучше всего воспользоваться командой grep. Например, если нужно отправить в файл 1.txt все строки, которые начинаются с «*» в файле file.txt, то для этого следует выполнить

grep '^*' 'file.txt' > 1.txt

Что касается вытаскивания заголовков из текста любого формата, то тут ничего толкового не получилось.
Но не пропадать же коду, пусть лежит тут:

Показать »

#!/bin/bash
n=$1
st=`sed -n ‘/^$/p’ $n| wc -l | awk ‘{print$1}’` #считаем кол-во пустых строк
sed -nr ‘/^.{100}/!p’ $n > /tmp/copy2$n #интересуют только строки с менее чем 100 символами (вряд ли заголовки будут длиннее)
sed -n «1p» /tmp/copy2$n > ‘Заголовки ‘$n # Выносим первую строку (уж она то будет заголовком)
#
tr ‘n’ ‘^’ /tmp/copy$n # Меняем все переносы на символ ^
#
#Меняем последовательность из ^^^(и т.д.) на двойные переносы (получается пустая строка)
#А одинарный ^ меняем на одинарный перенос (без пустой строки).
sed -i ‘s/^^^^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^/nn/g’ /tmp/copy$n
sed -i ‘s/^/n/g’ /tmp/copy$n
#
while [ $st -gt 0 ] #цикл на такое же кол-во раз, сколько и пустых срок.
do
st=$[$st-1]
sed -i ‘1,/^$/ d’ /tmp/copy$n #удаление всех строк до первой пустой (включая её саму)
sed -n «1p» /tmp/copy$n >> ‘Заголовки ‘$n #оставшуюся строку добавляем в файл
done

Кстати, этот код вполне справился со сравнением тех файлов, которые были мне присланы, однако с реальными книгами были проблемы.

Поделись статьёй с друзьями

Или просто поиграйся с кнопочками

1 комментарий на «Сравнение текстовых файлов в linux»

  1. >Гораздо удобнее перенаправить вывод в файл с расширением diff

    Гораздо удобнее использовать colordiff или meld.

Добавить комментарий