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

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

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

expo1.csv:

102,GREAT,прилагательное,ENG,p1_0,нет,p2_1,нет,p3,нет,4,да,p5_2,нет,p6,да....,su1,amb,su_09,нет

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это файл на сервере, и impo1.csvэто файл, который я создал для обновления expo1.csv. Скрипт вносит изменения, expo1.csvкак указано в impo1.csvпосле выполнения небольшой обработки в данных impo1 (например, строка 102,p2,yes impo1.csvобрабатывается, а затем выполняется обновление в expo1.csv- p2_1,yes.)

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

102,GREAT,прилагательное,ENG,p1_0,нет,p2_1,да,p3,нет,4,да,p5_2,нет,p6,да....,su1,amb,su_09,нет

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

110,.........,su11_0,нет

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

До сих пор я мог изолировать данные между запятыми в impo1.csvотдельные переменные, используя awk:

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

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

Использую GNU bash 4.1.2.

EDIT - Следовало упомянуть об этом раньше, моя ошибка - в файле impo1.csv нет четких шаблонов, которые я мог бы использовать для проверки файла expo1. Я внес исправления в содержимое файла-образца, которые иллюстрируют мою точку зрения.

решение1

Решение довольно простое. Вам просто нужно создать шаблон из каждой строки, 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 )
}

решение2

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

Связанный контент