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