Построчное сравнение txt файлов

  • Yapriehal 03.04.2024
    Как сравнить строки в 2 текстовых файлах и посчитать уникальные строки в file1.txt и вывести их в отдельном файле в формате содержимого file1.txt, если:

    1. Содержимое file1.txt:

    12345:qidhiqe
    23456:348wic
    34567:2y7dfg73
    18278:edui
    45678:38fdh83

    2. Содержимое file2.txt:

    12345
    23456
    34567
    45678
    39213

    Я только еще изучаю Linux и, в частности, терминал, поэтому туплю и не могу сообразить, как это сделать и реально ли это сделать только с помощью терминала. Если реально - то какими командами?

    Как бы, есть предположение, относительно команды diff, но пока ничего толкового у меня не вышло
  • robuxrobux 03.04.2024
    Так ты не можешь diff запустить, в чем проблема?
    Попробуй такие варианты:

    diff file1.txt file2.txt > raznica1.diff
    diff file2.txt file1.txt > raznica2.diff

    Полученные diff-файлы лучше просматривать в mc по F4 - он подсвечивает, что добавилось, что убавилось.

    Если хочешь в графике сравнивать, то есть программы Meld, Kompare.
  • xKDE 04.04.2024
    Домашнее задание нужно делать самостоятельно)
    robux:
    Так ты не можешь diff запустить, в чем проблема?
    Вы бы хоть man diff почитали, прежде чем примеры разбирать))) хотя нет, там слишком сложно...
  • xKDE 04.04.2024
    Yapriehal:
    как это сделать и реально ли это сделать только с помощью терминала. Если реально - то какими командами?
    Реально. Можно сделать всё diff. Но в данном примере есть более простые пути! Минимум 2 вижу навскидку.
  • Yapriehal 04.04.2024
    diff'ом у меня получается не то, что нужно, в т.ч. приведенным выше примером. А именно: я получаю файл, в котором содержатся абсолютно все строки из file1.txt и часть строк из file2.txt.

    Возможно, я не особо четко сформулировал вопрос. Перефразирую:
    Берем file1.txt и сравниваем строки из него со строками в file2.txt. Строки из file1.txt, которые не будут найдены в file2.txt, считаем уникальными, вот они-то нам и нужны. Эти строки и нужно вывести отдельно
  • Yapriehal 04.04.2024
    Проще говоря, если:

    1. Содержимое file1.txt такое:

    12345:qidhiqe
    23456:348wic
    34567:2y7dfg73
    18278:edui
    45678:38fdh83

    2. Содержимое file2.txt такое:

    12345
    23456
    34567
    45678
    39213

    3. То на выходе мы должны получить это:

    18278:edui
  • xKDE 04.04.2024
    Yapriehal:
    3. То на выходе мы должны получить это:18278:edui
    А с чего Вы взяли, что строка 12345:qidhiqe = 12345?)
  • Yapriehal 04.04.2024
    xKDE:
    Yapriehal:
    3. То на выходе мы должны получить это:18278:edui
    А с чего Вы взяли, что строка 12345:qidhiqe = 12345?)


    В моем случаи 12345:qidhiqe =12345. Ну, или все, что после ":" не учитывается

    Именно так стоит передо мной задача - это данность.
  • xKDE 04.04.2024
    Yapriehal:
    В моем случаи 12345:qidhiqe =12345. Ну, или все, что после ":" не учитывается
    Именно так стоит передо мной задача - это данность.
    Тогда по Вашей логике 18278:edui = 18278 и это, в принципе, просто! Если же нет, строка будет сложнее...
  • Yapriehal 04.04.2024
    xKDE:
    Yapriehal:
    В моем случаи 12345:qidhiqe =12345. Ну, или все, что после ":" не учитывается
    Именно так стоит передо мной задача - это данность.
    Тогда по Вашей логике 18278:edui = 18278 и это, в принципе, просто! Если же нет, строка будет сложнее...


    Так подскажите, какое решение? То, что я мог попробовать, в силу своей неопытности, уже попробовал - правильных решений не нашел на данный момент
  • xKDE 04.04.2024
    От простого к более простому:
    grep `awk -F":" '{ print $1 }'<file1|grep -Fxvf file2` file1 > file3
    grep `cat file1| sed -r 's/:.+//'|grep -Fxvf file2` file1 > file3
    sort file2 file1 file2 | uniq -u --check-chars=5 > file3
    txt добавите сами, в linux это не принципиально. Последний вариант для простоты сравнивает первые 5 символов, первые два -ищут разделитель ":".
    И таких вариантов реализации ещё достаточно много...
    P.S.: если в конце уберете "> file3", то получите вывод прямо в терминал.