2010-06-27 5 views
0

У меня есть 2 файла, у которых есть n строк. например: Файл 1Сравнение двух файлов в Unix

465466454 
546545454 
5454454 
Data=4545454545484848484 
kuh uytyer huihkuh 

Файл 2

e4654sdfdsf 
544hjklhjl 
464jku 
Data=4545454545484848484 
kuh uytyer huihkuh 

Как вы можете видеть оба файла получили одни и те же данные после того места "Data =" (это "Data =" происходит только один раз в файл)

Так что мне нужно вырезать строки, которые перед знаком «=», а затем сравнить эти два файла, а затем получить вывод, если эти 2 файла равны в файле формата csv.

Это не только один файл, но это будет много файлов в 2-х разных папках и каждый первый файл в одной папке, необходимо сравнить с первого файла в другую папку и так далее ..

+0

Можете уточнить свой вопрос? – mbq

+0

Немного расплывчато. Определите «Unix»: только оболочка Bash, программа на C, которая компилируется на большинстве Unices, GNU utils, ... Кроме того, что вам нужно для diff: строки перед строкой 'Data =' или строки после '= 'знак только на этой строке? Каким должен быть выход. Пожалуйста, переработайте свой пример, чтобы получить некоторое объяснение того, что должен делать алгоритм/сценарий и каков ожидаемый результат. – janmoesen

+0

Являются ли файлы в двух папках согласованными друг с другом, с одинаковыми именами файлов в каждой папке? например если есть файл myfile1111.txt в папке A, то гарантированно будет эквивалент myfile1111.txt в папке B? –

ответ

-1

Знаете ли вы, сколько строк у вас перед знаком «=»? (т. е. для двух заданных файлов: «n» равно или нет?) Поскольку вы можете использовать параметр -B (или - прежде) для grep.

+0

Привет, мы не можем указать количество строк, которые находятся перед знаком =. Я просто функциональный парень, не владеющий знаниями в области кодирования, особенно Unix. Не могли бы вы помочь мне с полным кодированием? –

+0

'-A' - это просто показать контекст на выходе. Если подсчет строки до = был известен и последователен, я бы, вероятно, использовал 'head'. @moustafa - если вы не знаете Unix или кодирование, почему эта задача назначена вам? (серьезно, а не саркастично) –

+0

моя ошибка, исправил сообщение. Благодарю. – Aif

2

это то, как вы используете AWK, чтобы получить данные после знака «=»

awk '/Data=/{gsub("Data=","");f=1}f' file > temp1 

, который перенаправляется во временный файл. сделайте то же самое для файла 2, который вы сравниваете. Затем используйте diff для сравнения файлов.

+0

Почему бы не 'awk -F 'Data =' '/^Data =/{print $ 2; } ' '? И если он использует недавнюю версию Bash, он может использовать подстановку процессов 'diff <(awk ... file1) <(awk ... file2)'. – janmoesen

3

Я думаю, вы должны уточнить свой вопрос. Ответы до сих пор предлагают использовать awk для получения строки после '='. Однако, насколько я понимаю ваш вопрос, вы хотите посмотреть все строки от начала до строки, начинающейся с «Data =».

Вы можете использовать

sed '/^Data=/,$d' file 

удалить все строки из первой строки, которая соответствует «^ Data =» до конца и кормить результат в дифф, используя синтаксис, janmoesen упомянутый, например,

diff <(sed '/^Data=/,$d' file1) <(sed '/Data=/,$d' file2) 
-1
#!/bin/bash 
FILE1=$(grep "=" $1 | cut -d"=" -f2) 
FILE2=$(grep "=" $2 | cut -d"=" -f2) 

if [ $FILE1 = $FILE2 ]; then 
    echo "Equal" 
else 
    echo "Not Equal." 
fi 

Простой скрипт Баш, который принимает два файла в качестве аргументов командной строки и возвращает Равный на равных. Очевидно, вы можете вставить любую другую команду вместо этого.

С помощью этого подхода вы можете передать список файлов, которые хотите проверить, и во втором аргументе.

* Редактировать: Ничего себе ... нерукотворный этот.

Смежные вопросы