Использование awk / for / grep для сравнения 2 файлов

У меня есть 2 файла csv, содержимое которых -

expo1.csv :

102, ВЕЛИКОЛЕПНО, прилагательное, ENG, p1_0, no, p2_1, no, p3, no, 4, да, p5_2, нет, p6, да ...., su1, amb, su_09, no

104, BHAAG, глагол, HIN, p1, да, p2, нет, p3_7, amb, p4, нет, p5, нет, p6_9, да ...., sg4_3, да, su119, amb

110, ......., su11_0, amb

и Impo1.csv :

104,p1,no
102,p2,yes
104,p10,no
110,su11,no

Обычно expo1.csv - это файл на сервере, а Immo1.csv - это файл, который я создал для обновления expo1.csv . Сценарий вносит изменения в expo1.csv , как указано в Immo1.csv , после выполнения небольшой обработки в данных imper1 (например, строка 102, p2, да из im1 .csv обрабатывается, а затем выполняется обновление expo1.csv - p2_1, да .)

expo1.csv после изменений:

102, ВЕЛИКИЙ, прилагательное, АНГ, p1_0, нет, p2_1, да, p3, нет, 4, да, p5_2, нет, p6, да ...., su1, amb, su_09, no

104, BHAAG, глагол, HIN, p1, нет, p2, нет, p3_7, amb, p4, no, p5, no, p6_9, да ...., sg4_3, да, su119, amb

110, ...... ..., su11_0, no

Теперь, после того, как сценарий внесет изменения, нам нужно проверить правильность внесения изменений, сравнив файлы Impo1 и expo1. Вот где я застрял.

Пока мне удалось выделить данные между запятыми в im1.csv отдельно на переменные с помощью awk :

Sno=104 102 104
Posw=p1 p2 p10
cho=no yes no

Теперь вопрос в том, как это проверить? Файлы imp1.csv содержат около 3000 обновлений. Если я grep p1 expo1.csv | grep no expo1.csv , очевидно, что он не вернет правильный результат, поскольку в файле много строк «нет». Я пробовал использовать цикл for для разделения данных с помощью awk на отдельные переменные, а затем grep с использованием подстановочного знака - grep sno expo1.csv | grep '/ <$ posw. *, $ Cho> / 'expo1.csv - но это не работает.

Использование GNU bash 4.1.2.

РЕДАКТИРОВАТЬ - Надо было упомянуть об этом ранее, моя проблема - в файле Impo1.csv нет четких шаблонов, которые я мог бы использовать для проверки файла expo1. Я внес исправления в содержимое файла примера, которые иллюстрируют мою точку зрения.

0
15.03.2018, 23:57
2 ответа

Решение довольно простое. Вам просто нужно создать шаблон из каждой строки Impo1.csv , а затем grep он из expo1.csv после обновления

validate() {
    # $1 ~ impo1.csv
    # $2 ~ expo1.csv after changes
    while read pattern; do
        grep -q "^$pattern" $2 || return 1
    done < <(sed "s/,/,.*/" $1 )
}
0
28.01.2020, 04:46
awk -F, '
    NR==FNR{
        for(i=1;i<NF;i)
            DATA[$1 SUBSEP $++i] = $++i;
        next
    }
    DATA[$1 SUBSEP $2] != $3
    ' expo1.csv impo1.csv

напечатает строки в Impo1.csv , которые отличаются от данных в expo1.csv

0
28.01.2020, 04:46

Теги

Похожие вопросы